[ AWS EKS編 ] AWS Fargate & ECR で Golang の Webアプリをデプロイする


はじめに

コンテナ基盤でwebサービスを運用する際には、kubernetesというコンテナオーケストレーションサービスを用いることが多いそうなので、kubernetesの基本的な部分に関して学習をしたのち、
AWS EKSにてwebアプリをデプロイしてみた。

kubernetesについて

kubernetesの基本的な概念について把握をするために、まずはじめに公式のチュートリアルをざっとこなしてみた。

公式チュートリアルを一通りこなした後は、EKSにてデプロイすることに挑戦した。
以前、AWS ECSにてコンテナ基盤でwebアプリをデプロイしたことがあったため、
デプロイするための大まかな流れについてはイメージがしやすかった。

EKSにデプロイ

AWS EKSへのデプロイについては基本的にAWSの公式ドキュメントを参考にして試行錯誤しながら行なった。

事前準備

EKSのリソースを操作するためには、ローカル上で実行する、 kubectl , eksctl コマンドをインストールする必要がある。

(参考)AWS公式ドキュメント

EKSクラスターの作成

EKSクラスターを以下のコマンドで作成する。
クラスターの作成は結構時間がかかるので気長に待つ。

eksctl create cluster \
--name go-cluster \
--region us-west-2 \
--with-oidc \
--ssh-access \
--ssh-public-key <your-key> \
--managed

上記のコマンドでクラスターを作成すると、同時にクラスター内にノードが作成されるので、以下のコマンドでノードが作成されたかどうかを確認する。
コマンドをうって、以下のしょうな出力があればノードの作成が無事に完了しているのでOK。

$ kubectl get nodes -o wide

NAME                                                    STATUS   ROLES    AGE     VERSION              INTERNAL-IP       EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                  CONTAINER-RUNTIME
fargate-ip-192-168-141-147.us-west-2.compute.internal   Ready    <none>   8m3s    v1.18.8-eks-7c9bda   192.168.141.147   <none>        Amazon Linux 2   4.14.209-160.335.amzn2.x86_64   containerd://1.3.2
fargate-ip-192-168-164-53.us-west-2.compute.internal    Ready    <none>   7m30s   v1.18.8-eks-7c9bda   192.168.164.53    <none>        Amazon Linux 2   4.14.209-160.335.amzn2.x86_64   containerd://1.3.2

(参考)AWS公式ドキュメント

namespaceを作成する

namespaceを作成する。
namespaceとはクラスター内をいくつかの領域に区切るために定義するものである。
VPCをサブネットで区切るイメージに近いのかもしれない。

kubectl create namespace go-namespace

serviceとdeploymentを定義する設定ファイル作成

kubernetesではマニュフェストと言われる、設定ファイルを作成する。

ローカル上で go-service.yml を作成。
ブラウザから閲覧するためには spec 部分に type : LoadBalancer を追加する必要があるようなので忘れずに追加する。

go-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: go-service
  namespace: go-namespace
  labels:
    app: go-app
spec:
----- 追加 ----------
  type: LoadBalancer
--------------------
  selector:
    app: go-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-deployment
  namespace: go-namespace
  labels:
    app: go-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: go-app
  template:
    metadata:
      labels:
        app: go-app
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: beta.kubernetes.io/arch
                operator: In
                values:
                - amd64
                - arm64
      containers:
      - name: web
        image: <自分がデプロイしたいECRにpushされている docker imageのuriを記述する>
        ports:
        - containerPort: 80

デプロイする

以下のコマンドで、EKSクラスターにデプロイする

kubectl apply -f go-service.yaml

(参考)AWS公式ドキュメント

(参考) DevelopersIO produced by Classmethod

ブラウザで確認

以下コマンドの出力内容の中に EXTERNAL-IP というものがあるのでこのエンドポイントを取得して、ブラウザでwebアプリが表示されればデプロイ成功です!

$ kubectl get service -n go-namespace
NAME       TYPE           CLUSTER-IP      EXTERNAL-IP                                                               PORT(S)        AGE
go-namespace   LoadBalancer   10.100.111.70   a988439dfjsjlfa1dca04c3e5ff60-221349856.us-west-1.elb.amazonaws.com   80:31363/TCP   10s

終わりに

自分で作成したwebアプリを何とか自力でEKSにデプロイすることができました。
今回は最低限の設定を用いてデプロイを行いましたが、細かなパラメータを設定したりして、もっと色んなことができるのだと思います。
今後も継続的にkubernetesについて学習をしてある程度習熟できるようになりたいですね。