![見出し画像](https://assets.st-note.com/production/uploads/images/162438545/rectangle_large_type_2_1e76ed0b9853bab88073f28c41b0a461.png?width=1200)
AWS:CloudFormation~AvailabilityZoneの書き方
みなさん、こんにちは。ちゃみみです。
本日は、CfnでAZの書き方でVSCodeでCFnを書いているとAZを指定するセクションが存在するサービスがちらほらあると思うのですが、そこでAZをハードコーティング(直書き)すると怒られたりそもそもデプロイできないケースがあったりするのでそのあたり備忘録として残しておこうと思います。
まず、ハードコーディングすると怒られるケースについて
AWSのCfnのナレッジでは、ハードコーディングで例をよく書いているのでそれに倣って書くとVSCodeではまず間違いなく怒られます(恐らく汎用性の面を見ているのだと思いますが)。
なのでコーダーとして書く方法って大方2パターンになるかなと思っていて今日はその書き方を残しておこうと思います。
例として、サブネット構成する際のセクションを例にとって説明をしていこうと思います。
ダメな例
![](https://assets.st-note.com/img/1731995283-xXaEfFiI3hCsWGlvuVDpc01J.png?width=1200)
VSCodeにLintが入っている場合は、これで書くと以下のように怒られます。。。苦
[cfn-lint] W3010: Don't hardcode ap-northeast-1a for AvailabilityZones
まぁ、何て言っているかというとAZをハードコードすな!!と言っているんですよねぇ
なのでテンプレートの汎用性(使いまわし)を高めるために2つの書き方があったりします。
一つは、Sub関数でコーディング、もう一つはSelect関数でコーディングする方法を取ります。
怒られない例~Sub
![](https://assets.st-note.com/img/1731995311-ELr3DgZnYxj5cGQ17oibmdpu.png?width=1200)
Sub関数以降のパラメータの書き方を見てほしいのですが、疑似パラメータを使ってこのテンプレートを利用したRegion上のAZを指定する方法を取っています。
!Sub ${AWS::Region}a
↓変換として東京リージョンで展開したとするとこんな感じになります。
ap-northeast-1a →上で「}a」とさりげなくaが付いているのでAZが指定されている形となります。
これでAZの指定ができるのでパラメータとしては成り立つのでデプロイが可能となります。
もう一つの怒られない例~Select
![](https://assets.st-note.com/img/1731995347-HwvNG9du5UBDgq2aQxklCJAE.png?width=1200)
ネット界隈を見る限りこれが正統派っぽいようなのですが、書くのが面倒なんであたしは良く!Subのほうを使っていますが、ポイントをお伝えします。
1でSelect関数により次の数字でオブジェクトの選定をします。
2でオブジェクトの順番を指定します。
3で指定されたパラメータ内で展開されているRegion(GetAZsでAZを指定しています)内のAZをリストとしています。
GetAZsって見慣れない関数ですが、指定されたリージョンのアベイラビリティーゾーンをアルファベット順にリストする配列を返すというもので前段で指定した数字とAZがリンクしているというものになります。
なので、東京リージョンのAZイメージとして
0 : ap-northeast-1a
1 : ap-northeast-1c
2 : ap-northeast-1d
となったりします。
ここでポイントなのが、この方法を取った時にGetAZsの中に予期せぬAZなどがある場合だと、想定と崩れてしまうので注意してください。
例えば、最近は見なくなりましたが東京リージョンには実は、ap-northeast-1bがあったりします。(いつの間にかなくなってましたが、、古いAWSアカウントにはあったりするようです)
上記のように存在している場合、以下のような配列になります。
0 : ap-northeast-1a
1 : ap-northeast-1b
2 : ap-northeast-1c
3 : ap-northeast-1d
となるので数字を変えてあげる必要があります。
ここでポイントなのが、サブネットをGetAZsで指定する場合にデフォルトサブネットに属するAZがそれぞれリスト分(a-dまで)無いと、作成時にNGが出るのでそこだけは注意が必要です。
GetAZsの但し書きというか重要ポイントには、以下の一文があります。
Important
For the EC2-Classic platform, the Fn::GetAZs function returns all Availability Zones for a region. For the EC2-VPC platform, the Fn::GetAZs function returns only Availability Zones that have a default subnet unless none of the Availability Zones has a default subnet; in that case, all Availability Zones are returned.
Similarly to the response from the describe-availability-zones AWS CLI command, the order of the results from the Fn::GetAZs function isn't guaranteed and can change when new Availability Zones are added.
デフォルトサブネットがない=この構文は使えない
と思うことなかれ!!きちんとデフォルトサブネットを作るコマンドはありますのでそれにて作成するようにしましょう。
参考URL:https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html#create-default-subnet
$ aws ec2 create-default-subnet --availability-zone ap-northeast-1d
引き続きよりよりCFnライフを楽しみましょう~
2022年05月03日
以下、宣伝です。
仲間も募集中なので、気になる方は↓の記事を覗いてみてくださいませ。
いい会社だと思いますよ。