CloudFormation✖️ecs-cliでECS✖️ALB構成を構築した際に苦労した点まとめ(テンプレあり)
CloudFormation✖️ecs-cliでECS✖️ALB構成を構築した際に苦労した点まとめ(テンプレあり)
誰かの役に立つ記事であれ。
この記事で得られること
- ECSの環境構築が楽になるテンプレを試せる
- ECS✖️ALB構成を作る際の全体像がわかるようになる
- ECSの環境構築の際につまづきそうなポイントがわかるようになる
構成の全体像
今回はECS-Cluster内のFrontコンテナを立てて通信できるようになるところまでを目標とします。
構築手順
ReadMEに書いてある手順をそのまま説明していきます。ReadMeにも補助となる情報が記載されているので確認してみてください。
事前準備
-
ECSを置く土台を構築
CloudFormationでVPCなどのネットワーク・ALBの設定・ECRやECS-Clusterの構築までを事前に行います。
-
ECS,ECRなどにアクセスするためのアカウントを作成
自分のlocal環境でリモートのECS・ECRとやりとりするための認証情報を持ったecs-cli用のユーザーをlocalに作成します。
-
ECRに上げるimageの動作確認
動作確認用のNginxのコンテナを立てるdocker-compose.ymlとDockerfileを用意しているのでローカルで動かして動作確認してみてください。(M1でも動きます)
-
awslogs-groupを先に作る
awslogsはなくてもECSは動くのですが、ECSを立ち上げる時などにエラーが出た時に原因を早く見つけられるので導入しています。(著者が詰まったときに助けられた経験から)
-
ECSタスク定義用のcompose.ymlを修正する。
ECSのタスク定義はjsonで書かれるのがよくあるやり方なのですが、今回はyamlで作成します。イメージの管理と併用できて便利だったりするためです。
params.ymlで普通のdocker-compose.yamlでは扱わない情報を指定する必要があるので注意が必要です。
-
.envを自分の環境に合わせて埋める
.envの変数を埋めてください。
基本的には、ECSの立ち上げに使うscriptの変数だったり、ECRにイメージをpushする際に必要な変数だったりが.envで指定されています。
-
サービスリンクロールを作成しておく
サービスリンクロールとは、ECSから他のAWSサービスを扱う際に必要なRoleがあらかじめ設定されたIAMRoleのことです。ただし、一度コンソール画面から手動でECSを起動したりしないと作成されないので、あらかじめ公式のドキュメントなどをみて作成しておいてください。
構築開始
-
イメージをECRにpush(latest tagでpush)
./ecs-push.sh
を実行localのnginxイメージを
latest
タグを付けてpushします。 -
pushしたイメージに日付tagを追加
./ecr-retag.sh template/app latest
を実行1, 2の手順によってイメージのタグは
latest, 日付
となっています。これが最新のイメージです。もし新しくlatest
タグのイメージがpushされると、過去のlatest
タグは最新のものに付け変わり、過去のイメージは日付
タグのみになります。このようにしてイメージの管理をしていきます。
-
ecs-cli compose service up
でサービスのタスク定義を作成・デプロイ./ecs-up-service.sh
を実行service up
はcreate
とstart
の二つが合わさったコマンド。ここでようやくECSが実行され、状態がRUNNING
になればOK。 -
ALBのDNS名でアクセス
- localで試した時と同じhtmlが表示されれば成功!
つまづいたエラー✖️4まとめ
ReadMeを参考に説明
-
Roll関連のエラー
どうやら2つめの信頼関係ポリシーに
ecs-tasks.amazonaws.com
が許可されていないらしかった。(サービスリンクロールがない時に出たエラー: 後述)FATA[0303] Deployment has not completed: Running count has not changed for 5.00 minutes
-
ECRからイメージをPULLできない
-
imageの指定するECRのURlが間違っていた
(template/app -> 00000000000.dkr.ecr.ap-northeast-1.amazonaws.com/template/app:latest)
-
ECSをPublicSubnetに置く(IGWをつける)か、VPCエンドポイントでECRにつなげるようにしないといけなかった。(ALB経由でPULLできると思っていた)
ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post https://api.ecr.ap-northeast-1.amazonaws.com/: dial tcp : i/o timeou
-
-
イメージのアーキテクチャが合ってない
pushするイメージがM1用のものになっていたために出たエラー。
amazon-linux上で動くものに変更。(
nginx -> amd64/nginx
)Essential container ~
-
サービスリンクロール関連のエラー
サービスリンクロールが何かのタイミングで作られたため、インスタンスロールを付与するように設定していたECS up scriptでエラーが出た。
サービスリンクロールが設定されているECSに新しいインスタンスRoleは設定できないといったエラー。
今回のCloudFormatioinテンプレではインスタンスロールを設定しないようにして対応 (詳細)
ERRO[0005] Error creating service error="InvalidParameterException: You cannot specify an IAM role for services that require a service linked role.
次にやること
github actionから自動デプロイ設定ができるようにしてみる。
そもそもこのような構成にしたのはGithubActionからECSを起動できるようなCD環境を作りたかったからなので、ようやくそちらの本命の実装に取り掛かれそうです。
Discussion