IaC テンプレートを検証 → 変更セット → 手動承認 → 自動デプロイするパイプラインを構築する
このハンズオンでは、CloudFormation テンプレート(IaC)そのものを CI/CD で自動デプロイするパイプラインを構築します。GitHub への push をトリガーに、CodeBuild でテンプレートを検証(cfn-lint)し、CodePipeline の CloudFormation デプロイアクションで変更セット(Change Set)を作成、手動承認を経て実行します。コンテナをデプロイする既存の CI/CD ハンズオンとは異なり、インフラ定義の安全な継続的デリバリーを学びます。
| 項目 | 内容 |
|---|---|
| 対象サービス | CodePipeline、CodeBuild、CloudFormation、CodeConnections(GitHub 連携)、IAM、S3 |
| 主な学習内容 | テンプレート検証・変更セット・手動承認ゲート・CloudFormation デプロイアクション |
| 所要時間 | 75〜90 分 |
| 難易度 | ★★★☆☆(中〜上級者向け) |
| 前提知識 | CloudFormation・IAM の基礎知識、GitHub アカウント |
| 費用目安 | 約 0〜1 USD(CodeBuild の実行時間と S3 が中心。デプロイ対象は無料枠内) |
| リソース | 名前 / 値 | 備考 |
|---|---|---|
| GitHub リポジトリ | handson-iac | IaC テンプレート置き場 |
| CodeConnections 接続 | handson-iac-connection | GitHub 認証 |
| CodeBuild プロジェクト | handson-iac-validate | テンプレート検証 |
| CodePipeline | handson-iac-pipeline | Source → Build → Deploy |
| CloudFormation デプロイロール | handson-iac-cfn-role | CFN が引き受けるロール |
| デプロイ対象スタック | handson-iac-stack | S3 + DynamoDB |
AWS CLI・Git・Docker などのインストールと初期設定は 環境セットアップガイド にまとめています。初めての方は先にご確認ください。
ap-northeast-1(東京) に固定することAWS は CodeCommit の新規利用を 2024 年 7 月に停止しました。本ハンズオンでは GitHub を Source として CodeConnections(旧 CodeStar Connections)で連携します。
GitHub に新規リポジトリ handson-iac を作成し、以下の 2 ファイルを置きます。
S3 バケットと DynamoDB テーブルを定義した、無料枠内の安全なテンプレートです。
AWSTemplateFormatVersion: '2010-09-09'
Description: Handson IaC CI/CD sample stack (S3 + DynamoDB)
Resources:
SampleBucket:
Type: AWS::S3::Bucket
Properties:
VersioningConfiguration:
Status: Enabled
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
SampleTable:
Type: AWS::DynamoDB::Table
Properties:
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
Outputs:
BucketName:
Value: !Ref SampleBucket
TableName:
Value: !Ref SampleTable
テンプレートを validate-template と cfn-lint で検証し、成果物として次ステージへ渡します。
version: 0.2
phases:
install:
runtime-versions:
python: 3.12
commands:
- pip install cfn-lint
build:
commands:
- echo "Validating template..."
- aws cloudformation validate-template --template-body file://template.yaml
- cfn-lint template.yaml
artifacts:
files:
- template.yaml
2 ファイルを main ブランチに push しておきます。
CodePipeline コンソール → 左メニュー 「設定」→「接続」 →「接続を作成」。
「GitHub に接続」→ 「AWS Connector for GitHub」アプリのインストールを許可し、対象リポジトリを選択します。接続のステータスが 利用可能(Available) になれば完了です。
CodePipeline の CloudFormation アクションは、CFN がリソースを作成する際に引き受けるロール(デプロイロール)を必要とします。
IAM → ロール → ロールを作成 → カスタム信頼ポリシー。CloudFormation サービスが引き受けられるようにします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "cloudformation.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
テンプレートが作る S3 と DynamoDB を操作できる権限を付与します(ハンズオンでは管理ポリシー、本番では最小権限を推奨)。
AmazonS3FullAccessAmazonDynamoDBFullAccess作成後、ロール ARN(arn:aws:iam::<account-id>:role/handson-iac-cfn-role)を控えます。
CodePipeline / CodeBuild のサービスロールは、後続ステップのウィザードで自動作成されます。パイプラインのロールには CloudFormation アクションで上記デプロイロールを渡すための iam:PassRole が必要ですが、ウィザード作成のロールには通常含まれます。
CodeBuild → ビルドプロジェクトを作成。
ソースは後で CodePipeline から渡されるため、ここでは「ソースなし/後で設定」でも構いません(パイプライン作成時に CodeBuild ステージとして組み込みます)。
aws cloudformation validate-template を実行するため、CodeBuild サービスロールに cloudformation:ValidateTemplate を許可します(自動作成ロールに追加)。cfn-lint は API を使わないローカル検証です。
Source → Build →(変更セット作成 → 手動承認 → 変更セット実行)の Deploy ステージを組みます。
Source プロバイダー:接続 handson-iac-connection → リポジトリ handson-iac → ブランチ main。出力アーティファクト名は SourceArtifact とします。
プロバイダー AWS CodeBuild → プロジェクト handson-iac-validate。入力 SourceArtifact、出力 BuildArtifact。
アクションプロバイダー AWS CloudFormation を追加し、次のように設定します。
テンプレートが IAM リソースを作る場合は Capabilities に CAPABILITY_NAMED_IAM を指定します。本サンプル(S3 + DynamoDB)は IAM を含まないため不要です。
同じ Deploy ステージに、変更セット作成アクションの後段として手動承認アクションを追加します。
(任意)SNS トピックを指定すると承認依頼を通知できます。
承認の後段に、もう 1 つ CloudFormation アクションを追加します。
1 つの Deploy ステージ内で「CreateChangeSet(実行順 1)→ ReviewChangeSet(実行順 2)→ ExecuteChangeSet(実行順 3)」と直列になるよう実行順序を設定します。
パイプライン作成後、自動的に 1 回目が走ります。Source → Build と進み、CreateChangeSet で変更セットが作られると ReviewChangeSet で停止します。
CloudFormation コンソール → スタック handson-iac-stack →「変更セット」タブで handson-iac-changeset を開き、追加されるリソース(S3・DynamoDB)を確認します。問題なければ CodePipeline に戻り、「レビュー」→「承認」します。
リポジトリの template.yaml を編集して push し、変更セットに差分が出ることを確認します。例:DynamoDB にタグを追加。
SampleTable:
Type: AWS::DynamoDB::Table
Properties:
BillingMode: PAY_PER_REQUEST
Tags:
- Key: Project
Value: handson-iac
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
push 後、パイプラインが再実行され、変更セットに [~] Modify として差分が表示されます。承認すると適用されます。
以下を順番に削除します。CloudFormation スタックを削除すると、作成した S3・DynamoDB もまとめて消えます。
handson-iac-stack を削除(S3 バケットにオブジェクトがある場合は先に空にする)handson-iac-pipelinehandson-iac-validatehandson-iac-connectionhandson-iac-cfn-role とウィザードが作成したパイプライン/ビルド用ロールcodepipeline-ap-northeast-1-xxxxx(中身を空にしてから削除)handson-iac-stack が残っていない| 習得したスキル | 実践内容 |
|---|---|
| IaC の継続的デリバリー | GitHub push → 検証 → 変更セット → 承認 → デプロイの自動化 |
| テンプレート検証 | CodeBuild で validate-template + cfn-lint |
| 変更セット | デプロイ前に差分をプレビューし誤適用を防止 |
| 手動承認ゲート | 人のレビューを挟んだ安全なデプロイ |
同じことを GitHub だけで完結させたい場合は CloudFormation CI/CD(GitHub Actions)ハンズオン を参照してください。OIDC でアクセスキー無しに認証します。