メインコンテンツへスキップ

AWS CDK(TypeScript)でEC2起動タイプのECS環境を構築しようとしたらEC2インスタンスがECSクラスタに認識されずにハマった

··1099 文字·3 分·
プログラミング AWS AWS ECS インフラ
著者
a
目次

状況
#

前の仕事でyamlでcloud formationをいじるのがきつかったので練習がてら🔗AWS CDKを導入して環境構築していたらEC2インスタンスが存在して稼働しているのにECS側からEC2インスタンスが認識されず

No Container Instances were found in your cluster.

のようなエラーがでた。

ECSクラスタを確認すると、確かにEC2インスタンスが稼働しているのにも関わらずECSクラスタからは認識されていなかった。

正常に認識されていれば、以下の画像のようにEC2インスタンス数が表示される。

原因
#

ECS agentが稼働していなかった。

ECS(コンテナのオーケストレーション)の機能を実現するためにはEC2インスタンス内でECS agentというプログラムがきどうされてないといけない。

EC2インスタンスのImageに普通のAmazon Linuxを使ってしまっていたためECS agentが稼働していなくてECSクラスタから認識されなかった。

そもそも普通のAmazon Linuxのイメージではecs agentはインストールされていないようだ。

🔗repost.aws: Why is my Amazon ECS on an Amazon EC2 instance unable to join the cluster?を読むとECS agentが稼働していればsudo systemctl status ecsで情報がでるはずだが、普通のAmazon Linux イメージを利用していたときはそもそもecsが存在しなかったのでエラーがでた。

EC2 インスタンス内で確認のためコマンドを打つ際はコンソールからセッションマネージャーで接続した。

解決
#

ecs agentが入っているイメージを使う。

Amazon ECS-optimized Linux AMIという最初からecs agentがインストールされていて何もせずにECSで使える公式のイメージを利用した。

🔗https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html

CDKのコードは

    const asg = new autoscaling.AutoScalingGroup(this, 'asg', {
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.NANO),
      machineImage: ec2.MachineImage.latestAmazonLinux2023({
        cpuType: ec2.AmazonLinuxCpuType.ARM_64
      }),
      desiredCapacity: 1,
      vpc: vpc,
    });

から

    const asg = new autoscaling.AutoScalingGroup(this, 'asg', {
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.NANO),
      machineImage: ecs.EcsOptimizedImage.amazonLinux2023(ecs.AmiHardwareType.ARM),
      desiredCapacity: 1,
      vpc: vpc,
    });

と変更してイメージを変えた。

言い訳
#

🔗公式のaws cdkのサンプルでは普通のamazon linuxを使っておりそれで問題ないと思ってしまったので解決に時間がかかった。

困りましたよ。
サンプル動くの?

関連リソース
#

編集後記
#

CDKはやはりyamlより楽で良いですね。

特にTypeScriptの型情報で必須項目が分かったり、クラスやフィールドにコメントがついているのでエディタで表示されてありがたいです。

可読性も高いです。

仕事の開発などではレビューが楽になるはずです。

死にたくなければ新規開発の際はCDKを選択しましょう。

Related

C++ Boost::program_optionsでカスタムエラーメッセージを設定、表示する方法
··1231 文字·3 分
プログラミング C++ Boost
JSX(React)でテキストのコピーを禁止する
··513 文字·2 分
プログラミング React JSX
久しぶりに使ったことのないプログラミング言語(Julia)を学習して気がついたこと
·1623 文字·4 分
プログラミング 学習 Julia Plots.jl