🏕️

CloudFormation✖️ecs-cliでECS✖️ALB構成を構築した際に苦労した点まとめ(テンプレあり)

2022/09/25に公開

CloudFormation✖️ecs-cliでECS✖️ALB構成を構築した際に苦労した点まとめ(テンプレあり)

誰かの役に立つ記事であれ。

この記事で得られること

  • ECSの環境構築が楽になるテンプレを試せる
  • ECS✖️ALB構成を作る際の全体像がわかるようになる
  • ECSの環境構築の際につまづきそうなポイントがわかるようになる

構成の全体像

今回はECS-Cluster内のFrontコンテナを立てて通信できるようになるところまでを目標とします。

構築手順

ReadMEに書いてある手順をそのまま説明していきます。ReadMeにも補助となる情報が記載されているので確認してみてください。

https://github.com/KEN3pei/ECS-Cloudformation-sampel-01

事前準備

  1. ECSを置く土台を構築

    CloudFormationでVPCなどのネットワーク・ALBの設定・ECRやECS-Clusterの構築までを事前に行います。

  2. ECS,ECRなどにアクセスするためのアカウントを作成

    自分のlocal環境でリモートのECS・ECRとやりとりするための認証情報を持ったecs-cli用のユーザーをlocalに作成します。

  3. ECRに上げるimageの動作確認

    動作確認用のNginxのコンテナを立てるdocker-compose.ymlとDockerfileを用意しているのでローカルで動かして動作確認してみてください。(M1でも動きます)

  4. awslogs-groupを先に作る

    awslogsはなくてもECSは動くのですが、ECSを立ち上げる時などにエラーが出た時に原因を早く見つけられるので導入しています。(著者が詰まったときに助けられた経験から)

  5. ECSタスク定義用のcompose.ymlを修正する。

    ECSのタスク定義はjsonで書かれるのがよくあるやり方なのですが、今回はyamlで作成します。イメージの管理と併用できて便利だったりするためです。

    params.ymlで普通のdocker-compose.yamlでは扱わない情報を指定する必要があるので注意が必要です。

  6. .envを自分の環境に合わせて埋める

    .envの変数を埋めてください。

    基本的には、ECSの立ち上げに使うscriptの変数だったり、ECRにイメージをpushする際に必要な変数だったりが.envで指定されています。

  7. サービスリンクロールを作成しておく

    サービスリンクロールとは、ECSから他のAWSサービスを扱う際に必要なRoleがあらかじめ設定されたIAMRoleのことです。ただし、一度コンソール画面から手動でECSを起動したりしないと作成されないので、あらかじめ公式のドキュメントなどをみて作成しておいてください。

構築開始

  1. イメージをECRにpush(latest tagでpush)

    ./ecs-push.shを実行

    localのnginxイメージをlatestタグを付けてpushします。

  2. pushしたイメージに日付tagを追加

    ./ecr-retag.sh template/app latestを実行

    1, 2の手順によってイメージのタグはlatest, 日付となっています。これが最新のイメージです。もし新しくlatestタグのイメージがpushされると、過去のlatestタグは最新のものに付け変わり、過去のイメージは日付タグのみになります。

    このようにしてイメージの管理をしていきます。

  3. ecs-cli compose service upでサービスのタスク定義を作成・デプロイ

    ./ecs-up-service.shを実行

    service upcreatestartの二つが合わさったコマンド。ここでようやくECSが実行され、状態がRUNNINGになればOK。

  4. 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できない

    1. imageの指定するECRのURlが間違っていた

      (template/app -> 00000000000.dkr.ecr.ap-northeast-1.amazonaws.com/template/app:latest)

    2. 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