こんにちは。インフラの現場で「手作業」という名の爆弾を処理し続けてきた諸君、ようこそ。
AWS CloudFormation(以下CFn)。AWSが提供するIaC(Infrastructure as Code)の原点にして頂点。マウスでポチポチとコンソールを操作する時代は終わりました。「インフラをコードとして定義し、何度実行しても同じ結果が得られる(冪等性の担保)」。この境地に達したとき、君たちのインフラは「管理されるもの」から「定義されるもの」へと進化します。
今日は、CFnの設計思想を深く理解し、明日から現場で「おっ、こいつ分かってるな」と思われるレベルのテンプレート作成術を伝授しましょう。
—
1. CloudFormationの骨格:テンプレートの必須セクション
CFnテンプレートは、YAMLまたはJSONで記述します。まずは、この「家」の骨組みを覚えましょう。
- `AWSTemplateFormatVersion`: テンプレートのバージョン。`2010-09-09` 固定です。
- `Description`: テンプレートの目的。後で見た自分が泣かないために書く、未来の自分への手紙です。
- `Parameters`: 実行時に動的に値を渡すための変数。環境(dev/stg/prd)ごとの切り替えに必須。
- `Resources`: ここが心臓部です。 AWSリソース(EC2, S3, RDSなど)を定義します。
- `Outputs`: 作成されたリソースのIDやエンドポイントを表示します。スタック間連携の鍵になります。
—
2. 魔法の杖:頻出する組み込み関数
CloudFormationの真骨頂は「計算」にあります。ハードコーディングを排除し、動的にリソースをリンクさせる関数を使いこなしましょう。
1. `Ref`: 最も多用します。リソースの論理名を指定すると、物理ID(例: インスタンスID)を返します。
2. `Fn::GetAtt`: リソースの属性を取得します。例えば、ロードバランサーのDNS名を取得する際などに使います。
3. `Fn::Sub`: 文字列の中に変数を埋め込みます。`!Sub “web-${Environment}-server”` のように、直感的に名前を構築できるため、可読性が劇的に上がります。
—
3. プロの技術:可読性と冪等性を高めるベストプラクティス
初心者とプロの差は、この「守り」にあります。
- 論理名は一意に、かつ意味を持たせる: `Instance1` ではなく `WebServerInstance` と命名する。
- Mappingを活用せよ: 環境ごとに異なるAMI IDやインスタンスタイプを `Mappings` セクションに閉じ込め、if文のような複雑なロジックを避ける。
- タグ付けを義務化: 全てのリソースに `Name` タグを付与する。運用フェーズで後悔しないための唯一の道です。
—
4. 実践:HelloWorld的な構成(S3バケット作成)
まずは、最もシンプルな「S3バケット作成」から始めましょう。これが理解できれば、あとはリソースの種類を増やすだけです。
AWSTemplateFormatVersion: ‘2010-09-09’
Description: ‘S3 Bucket Creation Sample’
Parameters:
Environment:
Description: 環境名(dev, stg, prd)
Type: String
Default: dev
Resources:
# 論理名: MyS3Bucket
MyS3Bucket:
Type: ‘AWS::S3::Bucket’
Properties:
# Fn::Sub を使い、環境名に応じたバケット名を動的生成
BucketName: !Sub “my-app-assets-${Environment}”
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256 # セキュリティのベストプラクティス:暗号化は必須
Outputs:
BucketArn:
Value: !GetAtt MyS3Bucket.Arn
Description: 作成されたバケットのARN
このコードのポイント
- 冪等性: このコードを何度実行しても、バケットが存在していれば「変更なし」と判断され、事故を防ぎます。
- 汎用性: `Parameters` を変えるだけで、dev/stg/prd環境を安全に構築できます。
—
さあ、次は君の番だ
インフラ構築は「書く」作業から、「コードを最適化する」作業へとシフトしました。最初は難しく感じるかもしれませんが、このテンプレートをAWSコンソールの「CloudFormation」画面からアップロードしてみてください。数分後、君の定義したリソースがクラウド上に産声を上げます。
「なぜその設計にしたのか」 を言語化できるようになったとき、君はもう立派なSREの入り口に立っています。
次は、これをどうやってCI/CDパイプラインに乗せるか、あるいは `AWS CDK` へとステップアップするか……道は無限です。まずはこの「HelloWorld」を自分の手で動かし、その感動を味わってください。
応援しています。何か詰まったら、いつでも戻ってきてくださいね。