cdkでFargateへのデプロイが終わらくて詰まった件

cdkを使ってFargateにデプロイをしようとしたが、一向にリソースが作成されず以下のようなエラーが出てタイムアウトになってしまった。原因の調査に時間がかかったのでその記録

CannotPullContainerError: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

結論

パブリックなコンテナレジストリからイメージを取得する時は、assignPublicIpをtrueにしましょうという話

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-pull-container-error/

プログレスバーが動かない…

自分の持っているcdkのコードを久しぶりに使って、ECSにデプロイしようとしたが久しくcdkを触ってなかったので、何か問題が発生したときにイメージの不備かCDkの不備かの判断がつくようにいったんdockerイメージをnginx:latestに指定してデプロイしようとしてみた。

が、途中からいくらたってもプログレスバーが変化しなくなった。。。

hogehoge-production
hogehoge-production: deploying...
hogehoge-production: creating CloudFormation changeset...
[███████████████████████████████████████▍··················] (17/25)

Fargateのタスクが何回も落ちているみたい。調べると https://registry-1.docker.io/v2/ からイメージが取得できないらしい

CannotPullContainerError: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

ぐぐると、

パブリックサブネットでタスクを起動する場合は、Amazon EC2 コンソールでタスクを起動するときに、[自動割り当てパブリック IP] を [有効] にします。これにより、イメージを取得するためのアウトバウンドネットワークアクセスをタスクに付与できます。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-pull-container-error/

とのこと。自動割り当てパブリックIPをtrueにしたくなかったので、ECRにnginxイメージを移動させて、FargateのdockerイメージはECRから取得するように試すと問題なく動いた

+   const repository = ecr.Repository.fromRepositoryName(
+     this,
+     `ecr-${id}`,
+     'nginx'
+   )

    // Create a load-balanced Fargate service and make it public
    const service = new ecs_patterns.ApplicationLoadBalancedFargateService(this, `ecs-service-${id}`, {
      cluster: cluster, // Required
      cpu: 512,
      desiredCount: 1, // Default is 1
      taskImageOptions: {
-       image: ecs.ContainerImage.fromRegistry("nginx:latest"),
+       image: ecs.ContainerImage.fromEcrRepository(repository, "latest"),
        containerPort: 80,
        enableLogging: true,
        logDriver: logDriver,
        environment: {
          // 環境変数
        },
      },
      memoryLimitMiB: 1024, // Default is 512
      publicLoadBalancer: true,
      assignPublicIp: false,
      securityGroups: [appSecurityGroup]
    })
tech  cdk  fargate 

See also