aws-cdkの以下issueで言及されている内容で、かなり前から話題になっているようです。
事象
CDKに機能追加をして、生成されるテンプレートが一定のサイズを超えると、以下のようなエラーが発生しました。
Template format error: YAML not well-formed. (line 2528, column 49) (Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError
手元の環境では51KBまでは問題なく、それを超えるとエラーになるようでした。
エラーメッセージのline
が指しているのはファイルの末端箇所で、そこが特段変わっているような感じはありません。
以下のコメントで言われている通りです。
環境
- 言語
python3.8 - aws-cdkのライブラリ
1.158.0 - CDK-CLI
2.26.0 - Node.js
16.15.1
試したこと
追加したものが悪さをしているわけではない
元あったものを少し減らして、追加したいものを入れても51KB以内になるようにすれば、エラーは発生しない
生成されたtemplateに対してaws cloudformation validate-template
をしても、エラーは発生しない
具体的には以下の手順です。
- 該当のCodeBuildの
ビルドの詳細 -> アーティファクト -> アーティファクトのアップロード先
でS3に出力されているartifactが確認できるので、ダウンロードします。
デフォルトだと、KMS keyの権限エラーになる可能性があるので、該当S3ファイルの
プロパティ -> サーバ側の暗号化設定 -> AWS KMS キー ARN
からKMS キーポリシーを編集し、Principal
に自分のアカウントを追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::xxx:root"
]
},
"Action": [
- ダウンロードしたファイルを解凍し、中にあるjsonファイルを任意のS3上にアップロードした上で以下コマンドを実行
aws cloudformation validate-template --template-url https://xxxxxx.s3.ap-northeast-1.amazonaws.com/hoge/fuga.template.json
生成されたtemplate自体はCFnで問題なく実行できる
上記で取得したtemplateファイルを使って、新たに別スタックで実行することはできるので、
手間ですが意図していたリソースをデプロイすることは可能です。
エラーの回避方法
issueの中にも記載がありますが、特殊文字とファイルサイズの組み合わせがエラーを引き起こしているようです。
自分の場合は、APIGatewayのDesctiptionの中に日本語の文字を使っていたので、
それを全て1バイト文字にするとエラーが発生しなくなりました。
まとめ
マルチバイトの文字を使わなければ問題は無さそうですが、修正されると良いなと思い、
自分もissueにコメントしておきました。