はじめに
閲覧ありがとうございます、NTTデータ先端技術の@S-takahashi1129です。
今回はインフラ構築自動化学習の一環としてCodePipelineを使い、AWSコンソール上で完結する範囲の簡単なCI/CDを組んでみました。
構成
処理の流れは
①CodeCommitでCloudFormationテンプレートを編集、コミット
②コミットをEventBridgeが検知し、パイプラインをアクティブ化
③ソースリポジトリからテンプレートを取得
④テンプレートの構文チェック
⑤CloudFormationでリソースを自動作成
となります。
CodeCommit-リポジトリ作成
CodeCommitのコンソール画面からリポジトリを任意の名前で作成します。

CodeCommit-CloudFormationファイルの配置
コンソール画面からリポジトリを開き、「ファイルの作成」をクリックします。

エディタに直接CloudFormationテンプレートを書き込みます。

AWSTemplateFormatVersion: "2010-09-09"
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: test-bucket-exp11223344-001
VersioningConfiguration:
Status: Enabled
CodeCommit-CodeBuild用のBuildspecファイルの配置
ColoudFormationファイルと同様に、以下の内容のファイルをリポジトリに作成します。
version: 0.2
phases:
install:
runtime-versions:
python: 3.11
commands:
- pip install --upgrade pip
- pip install cfn-lint
build:
commands:
- echo "=== cfn-lint ==="
- cfn-lint template.yaml
内容としては、cfn-lintで構文チェックするだけの簡単なものです。
最終的にはリポジトリはこのような状態になります。

CodePipeline-パイプラインの作成
次にパイプラインの作成を行います。
1.作成オプションの選択する
まず、新規パイプラインの作成画面にてCategory「カスタムパイプラインを構築」を選択します。

2.パイプラインの設定を選択する
パイプラインの名前と、利用するサービスロールを設定します。
3.Add source stage
ソースステージを設定し、ソースとして先ほど作成したCodeCommitのCloudFormationテンプレートを指定します。
今回はソース変更を検知して自動で更新する構成とするため、EventBridgeの作成も有効化します。
ソースプロバイダー: AWS CodeCommit
リポジトリ名: my-repo (先ほど作成したもの)
ブランチ名: main
ソースの変更を自動的に検出するEventBridgeルールを作成: 有効化
4.ビルドステージを追加する - オプショナル
ビルドステージとして、ビルドプロジェクトを設定します。こちらは新規作成となるので、
「プロジェクトを作成する」から、ビルドプロジェクトの新規作成画面を表示します。

ビルドプロジェクトの設定は基本デフォルトでよいですが、Buildspecファイルの指定については、buildspec.yamlを明示的に指定します。
元のCodePipelineの画面に戻り、作成したビルドプロジェクトが設定されていれば成功です。
5.テスト - オプショナル
今回はスキップします。
6.デプロイステージを追加する
デプロイステージにて、CloudFormationでリソースを作成する設定を行います。
デプロイプロバイダー:CloudFormation
アクションモード:スタックを作成または更新する
スタック名:任意
テンプレート_アーティファクト名:BuildArtifact
テンプレート_ファイル名:template.yaml (CodeCommitに格納したファイル名)
サービスロールは一般的にCloudFormationが利用するロールを指定すればOKです。
動作確認
Deployまでパイプラインが成功したことを確認し、CloudFormationが実行されてリソースが作成されていることが確認できたら成功です。

自動更新の確認
CodeCommit上でテンプレートに任意の変更を加えると、自動的にパイプラインが駆動し、CloudFormationが自動実行されると思います。
また、誤ったテンプレートで更新すると、ビルドステージでエラーが発生し、Deployステージには進まない動作となります。
おわりに
以上です。
今回の例は非常に簡易的なもので、実務で使う場合はしっかりGitと連携させたり、インフラ更新前に承認フローをいれたり等もっと作りこむことになります。
Pipeline系サービスの感触を知りたい方の助けになれば幸いです。




