ヤマムギ

growing hard days.

*

ハンズオン: CloudFormation、SAM、Codeサービス ~AWS認定デベロッパーアソシエイト(DVA-C02)~

   

このブログは2026年6月29日翔泳社さんより発売される「AWS教科書 AWS認定デベロッパーアソシエイト テキスト&問題集」で扱う内容を体験していただくためのハンズオンガイドです。

このハンズオンガイドでは、CloudFormation、SAM、CodeCommit、CodeBuild、CodePipelineを使って、サーバーレスアプリケーションのデプロイとCI/CDパイプラインを構築します。インフラのコード化(IaC)によるデプロイの自動化と、コード変更時の自動ビルド・デプロイを体験します。

全体構成

東京リージョンで構築してください。
完成する構成は以下のとおりです。

(1) CloudFormationでEC2作業環境を構築する(git、Docker、SAM CLIをインストール)
(2) EC2上でSAMアプリケーションを作成してデプロイする(Lambdaバージョン/エイリアス + Canaryデプロイ)
(3) CodeCommitリポジトリにSAMプロジェクトをプッシュする
(4) CodeBuildでビルドプロジェクトを作成する
(5) CodePipelineでCI/CDパイプラインを構築する(ソース → ビルド → デプロイ)

一連のフロー:CodeCommit(コード変更) → CodePipeline → CodeBuild(sam build + sam package) → CloudFormation(デプロイ) → Lambda + API Gateway更新

準備:IAMポリシーの作成とアタッチ

ハンズオンで使用するIAMユーザーまたはIAMロールに、以下のポリシーをアタッチしてください。

タスク 1:CloudFormationでEC2作業環境を構築する

目的

CloudFormationテンプレートを使って、git、Docker、SAM CLIがインストールされたEC2作業環境を自動構築しましょう。IaC(Infrastructure as Code)の基本を体験します。

手順

(1) CloudShellを開いて、CloudFormationテンプレートを作成します:

(2) CloudFormationスタックを作成します:

(3) スタックの作成完了を待ちます(3〜5分かかります):

(4) EC2インスタンスIDを確認します:

(5) EC2コンソールでhandson-cicd-workenvインスタンスを選択し、[接続]-[セッションマネージャー]タブから[接続]をクリック。ユーザーデータの実行完了には数分かかるため、接続後に以下で確認します:

「Setup complete」と表示されればインストール完了です。

(6) インストールされたツールを確認します:

ポイント

  • CloudFormationテンプレートでEC2インスタンスとIAMロール、セキュリティグループをまとめて自動構築しています。
  • UserDataにより、インスタンス起動時にgit、Docker、SAM CLIが自動インストールされます(ブートストラップパターン)。
  • セキュリティグループにインバウンドルールがないため、SSHポートを開放せずにセッションマネージャーで安全に接続しています。
  • スタックを削除すれば、EC2、IAMロール、セキュリティグループもまとめて削除できます。

タスク 2:SAMでサーバーレスアプリケーションを作成してデプロイする

目的

EC2作業環境からSAMを使って、サーバーレスアプリケーションを作成・デプロイしましょう。LambdaのAutoPublishAliasとCanaryデプロイも設定します。

手順

(1) セッションマネージャーのターミナルでssm-userに再ログインします(UserDataで追加したDockerグループ権限を反映するため):

(2) SAMプロジェクトを初期化します:

(3) template.yamlを編集して、AutoPublishAliasとDeploymentPreferenceを追加します:

(4) ビルドします(EC2にPython 3.13がないため、Dockerコンテナ内でビルドします):

(5) ローカルでLambda関数をテストします。sam local invokeでDockerコンテナ内で関数を実行します(初回はイメージのダウンロードで数分かかります):

{"statusCode": 200, "body": "{\"message\": \"hello world\"}"} のようなレスポンスが返ればローカルテスト成功です。デプロイ前にコードの動作を確認できます。

(6) デプロイします:

(7) デプロイ完了後、APIエンドポイントを確認してテストします:

{"message": "hello world"} が返れば成功です。

(8) コードを変更してCanaryデプロイを体験します:

(9) ビルドして再デプロイします:

デプロイ中、CodeDeployが自動的にCanaryデプロイを実行します。まず10%のトラフィックが新バージョンに移行し、5分後に問題がなければ残り90%が移行します。

(10) Lambdaコンソールでバージョン2が作成され、liveエイリアスが更新されていることを確認します。

ポイント

  • sam initsam buildsam deployの3ステップでデプロイできます。
  • sam local invokeでDockerコンテナ内でLambda関数をローカル実行してテストできます。sam local start-apiでAPIとしてローカル起動することも可能です。
  • AutoPublishAliasを設定すると、デプロイのたびに新しいバージョンが発行されてエイリアスが更新されます。
  • DeploymentPreferenceでCanary10Percent5Minutesを指定すると、CodeDeployがまず10%のトラフィックを新バージョンに移行し、5分間問題がなければ残り90%を一気に移行します。
  • Canaryデプロイにより、全ユーザーに影響を与えずに新バージョンのリリースを安全に行えます。

タスク 3:CodeCommitリポジトリにSAMプロジェクトをプッシュする

目的

CodeCommitにリポジトリを作成して、SAMプロジェクトをプッシュしましょう。CI/CDパイプラインのソースとして使用します。

手順

(1) EC2のセッションマネージャーで以下を実行します。CodeCommitリポジトリを作成します:

(2) Gitの初期設定を行います:

(3) SAMプロジェクトをGitリポジトリとして初期化し、CodeCommitにプッシュします:

(4) マネジメントコンソールのCodeCommitコンソールでhandson-sam-appリポジトリを開き、ファイルが表示されることを確認します。

ポイント

  • CodeCommitはAWSが提供するプライベートGitリポジトリサービスです。
  • EC2のIAMロール経由で認証情報ヘルパーを使い、追加の認証設定なしでCodeCommitにアクセスしています。
  • CodeCommitはIAMと統合されているので、リポジトリへのアクセス制御をIAMポリシーで管理できます。

タスク 4:CodeBuildでビルドプロジェクトを作成する

目的

CodeBuildでビルドプロジェクトを作成して、SAMアプリケーションのビルドとパッケージングを自動化しましょう。

手順

(1) まず、SAMプロジェクトにbuildspec.ymlを追加します。EC2のセッションマネージャーで実行します:

(2) buildspec.ymlをコミットしてプッシュします:

(3) パイプラインのアーティファクト用S3バケットを作成します(バケット名は一意にしてください):

このバケット名をメモしておきます。

(4) マネジメントコンソールのCodeBuildコンソールにアクセスし、[ビルドプロジェクトの作成]をクリック。
(5) 以下の設定を行います:

項目 設定値
プロジェクト名 handson-sam-build
ソースプロバイダ AWS CodeCommit
リポジトリ handson-sam-app
ブランチ master
環境イメージ マネージド型イメージ
コンピューティング EC2
オペレーティングシステム Amazon Linux
ランタイム Standard
イメージ aws/codebuild/amazonlinux-x86_64-standard:6.0
特権付与 チェックを入れる
サービスロール 新しいサービスロール
ビルド仕様 buildspecファイルを使用する

(6) [環境変数]セクションで以下を追加します:

名前 タイプ
S3_BUCKET (手順3でメモしたバケット名) プレーンテキスト

(7) [アーティファクト]セクションはタイプ[なし]のまま、[ビルドプロジェクトを作成]をクリック。
(8) 作成されたCodeBuildのサービスロールに権限を追加します。IAMコンソールで、CodeBuildが自動作成したサービスロール(codebuild-handson-sam-build-service-roleのような名前)を開きます。
(9) [許可を追加]-[ポリシーをアタッチ]をクリックし、AdministratorAccessをアタッチします。

buildspec.yml内でsam build –use-containerを実行するため特権付きが必要です。また、sam packageでS3にアップロードするためAdministratorAccessを付与しています。本番環境では最小権限にしてください。

ポイント

  • buildspec.ymlはビルドの仕様を定義するファイルで、リポジトリのルートに配置します。
  • sam build --use-containerはDockerコンテナ内でビルドするため、CodeBuild環境のPythonバージョンに依存しません。
  • sam packageでビルド済みコードをS3にアップロードし、packaged.yamlを生成します。このpackaged.yamlをCloudFormationのデプロイステージで使用します。
  • 環境変数S3_BUCKETでパッケージのアップロード先を指定しています。

タスク 5:CodePipelineでCI/CDパイプラインを構築する

目的

CodePipelineを使って、コード変更を検知してビルド・デプロイを自動実行するCI/CDパイプラインを構築しましょう。デプロイステージではCloudFormationでSAMテンプレートを適用します。

手順

(1) まずデプロイステージで使用するCloudFormation用のIAMロールを作成します。IAMコンソールにアクセスし、[ロール]-[ロールを作成]をクリック。以下の設定で作成します:

項目 設定値
信頼されたエンティティタイプ AWSのサービス
サービスまたはユースケース CloudFormation
許可ポリシー AdministratorAccess
ロール名 handson-cfn-deploy-role

本番環境ではAdministratorAccessではなく最小権限にすべきですが、ハンズオンでは簡略化のためフルアクセスを使用します。

(2) CodePipelineコンソールにアクセスし、[パイプラインを作成する]をクリック。
(3) Step 1 [作成オプションを選択する]で[カスタムパイプラインを構築する]を選択して[次に]をクリック。
(4) Step 2 [パイプラインの設定を選択する]で以下を設定します:

項目 設定値
パイプライン名 handson-sam-pipeline
実行モード キュー
サービスロール 新しいサービスロール

(5) [次に]をクリック。
(6) Step 3 [Add source stage]で以下を設定します:

項目 設定値
ソースプロバイダー AWS CodeCommit
リポジトリ名 handson-sam-app
ブランチ名 master
ソースの変更を自動的に検出するEventBridgeルールを作成 チェックを入れる
出力アーティファクト形式 CodePipelineのデフォルト

(7) [次に]をクリック。
(8) Step 4 [ビルドステージを追加する]で[その他のビルドプロバイダー]を選択し、以下を設定します:

項目 設定値
プロバイダー AWS CodeBuild
プロジェクト名 handson-sam-build
ビルドタイプ 単一ビルド

(9) [次に]をクリック。
(10) Step 5 [テストステージを追加]は[テストステージをスキップ]をクリック。
(11) Step 6 [デプロイステージを追加する]で以下を設定します:

項目 設定値
デプロイプロバイダー AWS CloudFormation
リージョン アジアパシフィック(東京)
入力アーティファクト BuildArtifact
アクションモード スタックを作成または更新する
スタック名 handson-sam-stack
テンプレート BuildArtifact – packaged.yaml
Capabilities CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
ロール名 handson-cfn-deploy-role

(12) [次に]をクリック。
(13) Step 7 [レビュー]で確認して[パイプラインを作成する]をクリック。

パイプラインが作成されると、自動的にソースステージが実行されます。
初回実行はCodeCommitから最新のコードを取得してビルド・デプロイが実行されます。

(14) パイプラインの各ステージが緑(成功)になることを確認します。ビルドステージでエラーが発生した場合は、CodeBuildのログを確認してサービスロールの権限を修正します。

(15) パイプラインが成功したら、コードを変更してCI/CDの自動実行を確認します。EC2のセッションマネージャーに戻って以下を実行します:

(16) CodePipelineコンソールに戻り、パイプラインが自動的に開始されることを確認します。
(17) パイプラインが成功したら、APIエンドポイントにアクセスして更新されたメッセージを確認します:

{"message": "CI/CD Pipeline is working!", "deployedAt": "2026-06-..."} のようなレスポンスが返れば、CI/CDパイプラインが正常に動作しています。

ポイント

  • CodePipelineはソース・ビルド・デプロイの各ステージを連携させるCI/CDオーケストレーションサービスです。
  • CodeCommitへのプッシュをEventBridgeが検知して、自動的にパイプラインが開始されます。
  • ビルドステージでsam buildとsam packageが実行され、packaged.yamlがアーティファクトとしてデプロイステージに渡されます。
  • デプロイステージではCloudFormationがpackaged.yamlをテンプレートとして使い、スタックを作成/更新します。
  • CAPABILITY_IAMとCAPABILITY_AUTO_EXPANDの両方が必要です(SAMのTransformでIAMリソースが生成されるため)。
  • コードを変更してプッシュするだけで、自動的にビルド・デプロイが実行される継続的デプロイメント(CD)が実現されています。

クリーンアップ

ハンズオンで作成したリソースをすべて削除します。以下の順番で削除してください。

(1) CodePipelineの削除

CodePipelineコンソールでhandson-sam-pipelineを削除します。

(2) CodeBuildプロジェクトの削除

CodeBuildコンソールでhandson-sam-buildプロジェクトを削除します。

(3) CloudFormationスタックの削除(SAMアプリケーション)

CloudFormationコンソールでhandson-sam-stackを削除します。

(4) CodeCommitリポジトリの削除

CodeCommitコンソールでhandson-sam-appリポジトリを削除します。

(5) S3バケットの削除

S3コンソールで以下のバケットを空にしてから削除します:
– handson-cicd-artifacts-{アカウントID}(タスク4で作成)
– aws-sam-cli-managed-default-…(SAMが自動作成)
– codepipeline-ap-northeast-1-…(CodePipelineが自動作成)

(6) CloudFormationスタックの削除(EC2作業環境)

CloudFormationコンソールでhandson-cicd-workenvを削除します。EC2インスタンス、IAMロール、セキュリティグループもまとめて削除されます。

(7) IAMロールの削除

IAMコンソールで以下のロールを削除します:
– handson-cfn-deploy-role(タスク5で作成)
– CodeBuildとCodePipelineが作成したサービスロール

(8) CloudWatch Logsロググループの削除

CloudWatchコンソールの[ロググループ]で関連するロググループを削除します。

(9) ハンズオン用ポリシーの削除

ハンズオン用に作成したIAMポリシーがあれば削除します。

まとめ

タスク サービス 役割
タスク 1 CloudFormation テンプレートによるEC2作業環境の自動構築(IaC)
タスク 2 SAM サーバーレスアプリの定義とデプロイ(Canaryデプロイ)
タスク 3 CodeCommit Gitリポジトリによるソースコード管理
タスク 4 CodeBuild ビルドプロセスの自動化(buildspec.yml)
タスク 5 CodePipeline CI/CDパイプラインによるソース→ビルド→デプロイの自動化

このハンズオンで体験したデプロイの特徴をまとめます。

  • CloudFormationにより、インフラをコードとして管理(IaC)できます。テンプレートからスタックを作成・更新・削除できます。
  • SAMはCloudFormationの拡張で、サーバーレスアプリケーションの定義が簡潔に記述できます。
  • AutoPublishAliasとDeploymentPreferenceにより、Lambdaのバージョン/エイリアス管理とCanaryデプロイが自動化されます。
  • CodeCommitはプライベートGitリポジトリで、IAMと統合されたアクセス制御が可能です。
  • CodeBuildはbuildspec.ymlに基づくビルドプロセスを提供し、スケーラブルかつ従量課金で利用できます。
  • CodePipelineは各サービスを連携させてCI/CDを実現します。コード変更を検知して自動的にビルド・デプロイが実行されます。
  • CI/CDパイプラインにより、手動デプロイによるミスや遅延を排除し、頻繁で安全なリリースが可能になります。

最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「AWS認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS

  関連記事

AWS CloudHSMを起動してみました

なかなか触る機会のないサービス、CloudHSM。 起動してみました。 手順はユ …

AWS Organizationsからメンバーアカウントを直接「閉じる」ことができるようになりました

これまでは、メンバーアカウントはOrganizations組織から「除外」して独 …

Amazon S3アクセスポイント経由からアクション可能なポリシー

S3アクセスポイントを使うことで、複雑で長いバケットポリシーを避け、アクセスポイ …

IAMアクセス許可の境界でIAMロールの権限を制御する

IAMユーザー自身の権限はIAMポリシーで制御できますが、IAMユーザーにIAM …

ALBのヘルスチェックでPHPとMySQL接続をチェック

当ブログで504エラーが発生して、オートスケーリングにより自動でインスタンスが置 …

AWS認定試験の自宅受験で壁のポスターを注意されちゃいました

AWS認定オンライン受験をしてみましたに書きましたとおり、自宅受験デビューしまし …

このブログからパブリックIPv4 IPアドレスをなくしてコスト最適化

2024年2月より使用中のパブリックIPv4アドレスに1時間あたり0.005US …

Amazon VPCのAmazonProvidedDNSとほかメモ

VPCユーザーガイドのAmazon DNS について理解するの記載内容について実 …

EC2 Global Viewで不要なインスタンスを見つけて4つほど終了しました

EC2 Global Viewという機能がリリースされました。 EC2コンソール …

AWS Savings Plansを検討しました

今、個人でAWSアカウントを7つ使っています。 Savings Plansが使え …