CloudFormationからAWS CDKに乗り換えようとして今日も元気にビルドを失敗したので解決方法をメモっておく。
やりたいこと
私はただAWSのサンプルをビルドしたかっただけなんだ…!!
https://github.com/aws-samples/aws-cdk-examples/tree/master/python/ecs/fargate-load-balanced-service
###無慈悲なCREATE_FAILED
CloudFormationと違って抽象化が激しいので、一行でVPCを作れるんですよ。
その代わり中身を全く知らない。
VPCができる魔法の素晴らしいコード
vpc = ec2.Vpc(
self, "MyVpc",
max_azs=2
)
無慈悲に幻想を打ち砕くCREATE_FAILED
$ cdk deploy
~略~
Do you wish to deploy these changes (y/n)? y
~略~
9/36 | 7:11:35 AM | CREATE_COMPLETE | AWS::EC2::VPC | MyVpc (MyVpcF9F0CA6F)
~略~
10/36 | 7:11:38 AM | CREATE_FAILED | AWS::EC2::Subnet | MyVpc/PublicSubnet1/Subnet (MyVpcPublicSubnet1SubnetF123456) Value (ap-northeast-1a) for parameter availabilityZone is invalid. Subnets can currently only be created in the following availability zones: ap-northeast-1d, ap-northeast-1c, ap-northeast-1b. (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterValue; Request ID: xxxxx-xxxx-xxxx-xxxx-xxxxxxxxx)
彼が私に伝えたかったこと
Subnets can currently only be created in the following availability zones:
ap-northeast-1d, ap-northeast-1c, ap-northeast-1b.
はい。Subnetを作る時にアベイラビリティーゾーンに振り回されるのはCloudFormationの頃から慣れてます。慣れてるなりにさっさと解決したいのにどうすればいいのか分からず途方に暮れる。
ap-northeast-1aに作ろうとして怒られたんだろうなという事くらいは分かる。逆に言うとなんでそこに作ろうとしたのかまったく知らないんですよこっちは。
解決方法
cdk.context.json っていうファイルにavailability-zonesの指定があるので、ap-northeast-1a
があったら消す。
指定がなかったら下記の内容を追記する。
"availability-zones:account=123456789999:region=ap-northeast-1": [
"ap-northeast-1b",
"ap-northeast-1c",
"ap-northeast-1d"
]
おわり
3時間くらい悩んだ…。つらかった……。
まだまだCDKと仲良くなれない。
ところでgitignoreを見るとcdk.context.jsonがignoreされてるっぽいのですが、この設定って本当はどこに書いておくものなのかご存知の賢者様がいらっしゃれば教えていただけると嬉しいです。
~追記~
コマンドで設定したりcdk.jsonに書いたりソースコード内で指定したりしなさいって書いてありました^q^
- Through the --context option to the cdk command.
- In the context key of the project's cdk.json file.
- In the context key of a ~/cdk.json file.
- In code using the construct.node.setContext method.