状況 #
前の仕事で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を使っておりそれで問題ないと思ってしまったので解決に時間がかかった。
困りましたよ。
サンプル動くの?
関連リソース #
- 🔗Amazon ECS Linux container agent
ECS agent
編集後記 #
CDKはやはりyamlより楽で良いですね。
特にTypeScriptの型情報で必須項目が分かったり、クラスやフィールドにコメントがついているのでエディタで表示されてありがたいです。
可読性も高いです。
仕事の開発などではレビューが楽になるはずです。
死にたくなければ新規開発の際はCDKを選択しましょう。