はじめに
CloudFormation のテンプレート(YAML)を書いていたら、エディタが !Ref やら何やらを真っ赤なエラーにしてきました。16個くらい赤線。「これは絶対デプロイ通らないやつだ…」と覚悟して aws cloudformation deploy。
…通りました🎉 え、あの赤は何だったの?
エディタの赤線に、まんまとビビらされました😅
エディタが赤いのにデプロイは通った。この食い違いの正体と、「何を見れば確認できるのか」を残します。
環境
- AWS CloudFormation(YAML テンプレート)
- エディタ:VS Code / Cursor + YAML 拡張(redhat.vscode-yaml)
- 検証ツール:cfn-lint
- リージョン:ap-northeast-1
起きたこと
エディタが赤くしてきたのは、たとえばこんな所でした。
-
!Ref/!GetAttに「Unresolved tag」 - アベイラビリティゾーンの指定に「Incorrect type. Expected "string".」
-
UserDataのブロック全体に「Expected "string".」
該当箇所はこんな普通の書き方です(AZ を自動取得する定番):
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref StudyVpc
AvailabilityZone: !Select [0, !GetAZs ""] # ← ここが赤くなる
UserData もよく赤くなります(最後は文字列ですが、関数で組み立てるため):
UserData:
Fn::Base64:
Fn::Sub: |
#!/bin/bash
echo "hello"
どちらも「型が違う」「知らないタグ」と怒られる。でもそのままデプロイは成功しました。
原因
赤を出していたのは、汎用の YAML 拡張です。これは「普通の YAML」を見るツールで、CloudFormation 独自の書き方を知りません。
| 赤くなる箇所 | エディタの言い分 | 実際は |
|---|---|---|
!Ref / !GetAtt
|
知らないタグ | CloudFormation の短縮形 |
!Select [0, !GetAZs ""] |
文字列のはずが関数で変 | デプロイ時に AZ 名へ解決される |
UserData |
文字列のはず |
Fn::Base64 / Fn::Sub で組み立てられる |
エディタは「関数を実行する前の生の中身」を見て型違いと判定しているだけ。AWS はデプロイ時にこれらを解決するので、今回のテンプレートでは問題ありませんでした。
確認のしかた(cfn-lint を優先する)
CloudFormation テンプレートの確認では、エディタの色より cfn-lint を優先して見るのが安全です。
cfn-lint template.yaml
-
E(エラー)が無い → テンプレート上の問題は少なく、デプロイ前の判断材料になる。
- ただし IAM 権限・既存リソース・リージョン差・クォータ・パラメータ値などで、デプロイ自体は失敗することがあります(cfn-lint はそこまでは保証しません)。
-
W(警告) → 危険な書き方や改善点を教える助言。内容は必ず確認する。
- 例:パスワードのベタ書きを指摘する
W2501など、警告でも無視しない方がよいものがあります。
- 例:パスワードのベタ書きを指摘する
短縮タグ(!Ref 等)の誤検知だけなら、エディタ設定で減らせます。settings.json:
"yaml.customTags": [
"!Ref scalar",
"!GetAtt scalar",
"!Sub scalar",
"!Select sequence",
"!GetAZs scalar"
]
ただし UserData のような複雑な所は赤が残ることもあります。
学び
- 「エディタの色」と「CloudFormation として有効か」は別物。 赤い=間違い、ではない。
- テンプレートの確認は cfn-lint を優先(E はデプロイ前の判断材料、W は内容を確認)。
- ただし cfn-lint が緑でも、実行時の AWS 側の理由でデプロイが失敗することはある。最後は実際の結果も見る。
- ツールには得意・不得意がある。「何が何を確認できるのか」を見極めるのが大事。
おわりに
赤線に身構えた瞬間こそ、cfn-lint をひと回し——という小さなメモです😅 「エディタは真っ赤だけど大丈夫…?」と不安になった人の参考になれば嬉しいです🙌