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


はじめに

現職の現場ではプライベートクラウドを使用していて、本番環境の運用をAWSのようなパブリッククラウドを使用して、さらにECSのようなコンテナ基盤での運用ができていない。
docker imageを使用してコンテナ基盤で運用をすると本番環境の運用及び、本番環境へのデプロイ作業がものすごく楽になりそうなので、学習してみた。
この記事では、ローカル環境でdocker imageをビルドして、AWSのECRにプッシュ、その後ECSでデプロイを完了させるところまでを解説してみる。

ローカルにて

ビルドしたいDockerfileがおいてあるディレクトリと同じ階層でビルドする

docker build -t image_name .

ビルドしたimageにタグ付けをする。
この辺りのコマンドは、ECRにてリポジトリを作成したのち、AWSのコンソール上でもわかりやすくpushコマンドが説明されているので迷うことがあんまりなさそう。

docker tag image_name aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app

ECRにプッシュする。

docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app

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

ECSにてpushしたdocker imageをデプロイ

タスクを定義する

新しいタスク定義の作成

今回は「FARGATE」を選択する。

タスクとコンテナの定義の設定

「タスク定義名」を入力する。他の項目はデフォルトで。

タスクの実行 IAM ロール

「ecsTaskExcutionRole」がデフォルトで選択されているのでそのままで。

タスクサイズ

「タスクメモリ」を0.5GB、「タスクCPU」を0.25vCPUに設定する。(どちらも一番スペックが小さいやつ)

コンテナの定義

ここは結構需要だと思う。
「コンテナの追加」から、以下の設定項目を入力する。
「スタンダード」内にあるいくつかの入力項目は必ず入れる必要があるみたい。

設定項目 入力値  説明
コンテナ名 web -
イメージ aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app:latest ECRにpushしたdocker imageのURI
プライベートレジストリの認証 チェックなし -
メモリ制限(MiB) 300 300 ~ 500が推奨らしいので
ポートマッピング 80 これでホスト側とコンテナ側の80ポートがマウントされる

「詳細コンテナ設定」は省略しても大丈夫そう。
実際の運用となると、細かく設定するのだとは思いますが。

サービス統合

とりあえず省略

プロキシ設定

とりあえず省略

ログルーターの統合

とりあえず省略

ボリューム

とりあえず省略

Tags

とりあえず省略

起動ステータス

「タスク定義のステータス - 2/2 完了」となればタスク定義は完了。

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

クラスターを作成する

クラスターテンプレートの選択

クラスターテンプレートから「ネットワーキングのみ」を選択して、次のステップへ。

クラスターの設定

「クラスター名」を入力して「作成」へ。

サービスを作成する

サービスの設定

設定項目 入力値  説明
起動タイプ FARGATE -
タスク定義(ファミリー) web 先ほど定義したタスクを選択
タスク定義(リビジョン) 1(latest) 最新のタスク定義を選択
クラスター sample-cluster デフォルトで選択されるのでそのままで
サービス名 sample-service 任意の名前を
サービスタイプ REPLICA そのままで。設定したタスクの数を維持してくれるらしい。
タスクの数 1 維持したいタスクの数
最小ヘルス率 100 デフォルトのままで
最大率 200 デフォルトのままで
デプロイサーキットブレーカー 向こう デフォルトのままで

デプロイメント

デフォルトのままで

タスクのタグ付け設定

デフォルトのままで

Tags

とりあえず省略。

ネットワーク構成

VPC とセキュリティグループ

設定項目 入力値  説明
クラスターVPC 任意のVPC -
サブネット 任意のサブネット -
セキュリティグループ デフォルト -
パブリックIPの自動割り当て ENABLED -
セキュリティグループ デフォルト -

ヘルスチェックの猶予期間

とりあえず省略

ロードバランシング

今回は「なし」を選択する。

App Mesh

とりあえず省略

サービスの検出

とりあえず省略

Auto Scaling (オプション)

「サービスの必要数を直接調節しない」を選択する。

確認

確認後、「サービスの作成」を押す。

起動ステータス

「ECSサービスのステータス - 3/3 完了」となればサービスの作成は完了。

ブラウザで確認

サービスの詳細ページから、「タスク」タブを選択後、タスク一覧からタスクの詳細を確認。

確認したパブリックIPをブラウザに入力してwebアプリが表示されたらデプロイ完了。

終わりに

AWSのコンテナ基盤を使用してデプロイすると非常に簡単で便利でした。
AWSの公式ドキュメントにも手順が丁寧に書かれていてあまり使い慣れていない私でも問題なく扱うことができました。
デプロイする過程で細かな設定項目はスキップしましたが、実際の運用では、細かい設定も行うのだと思います。
今後、コンテナ基盤で本番環境を運用している現場などで、実務での使われ方をキャッチアップしていきたいです。