GitHub ActionsでAWS CDKを自動デプロイする方法|Assume Roleでセキュアに構築

この記事の目次
はじめに
AWS上にアプリケーションをデプロイする際、安全かつ効率的に運用するためには、手作業ではなく自動化された仕組み(CI/CDパイプライン)を導入することが重要です。
本記事では、インフラ構築ツールであるAWS CDK(Cloud Development Kit)と、GitHubが提供するCI/CDサービス「GitHub Actions」を組み合わせて、インフラの自動デプロイを実現する方法を解説します。
GitHub Actionsは、YAML形式のファイルで処理内容を定義し、リポジトリへの変更や手動操作をトリガーとして、自動的にビルドやデプロイを実行できる仕組みです。これらを活用し、CDKプロジェクトを安全に、手間なく効率的にデプロイする方法を紹介します。

GitHub Actionsとは?
GitHub Actionsは、GitHubが提供するCI/CD(継続的インテグレーション/継続的デリバリー)サービスです。リポジトリ内に.github/workflowsディレクトリを作成し、YAML形式のファイルで処理内容を定義することで、コードの変更に応じた自動化が可能になります。
YAMLファイルでは、「ワークフロー」と呼ばれる自動化の処理全体を定義します。ワークフローは複数のジョブで構成され、各ジョブの中にステップを記述することで、具体的な処理(たとえば「コードをチェックアウトする」「依存関係をインストールする」「デプロイを実行する」など)を順番に実行できます。ジョブは並列に、ステップはジョブ内で順番に実行されるのが基本です。
たとえば、プッシュやプルリクエストなどのイベントをトリガーにして、テストやビルド、デプロイといった作業を自動で実行できます。これにより、手作業のミスを防ぎつつ、効率的な開発・運用が実現できます。
主な特徴は以下の通りです。
- YAMLで定義:シンプルな記法で柔軟に処理フローを記述可能
- GitHubとの統合:プッシュやプルリクエストなどのイベントで自動的に実行される
- マトリックスビルド:異なる環境(例:OSやNode.jsのバージョン)で同時にテスト可能
- セルフホストランナー:自社環境など任意のマシン上でワークフローを動かせる
CDKプロジェクトのデプロイワークフロー
ここからは、CDKで作成したインフラ構成をGitHub Actions経由で自動デプロイするためのワークフロー作成および設定の手順を紹介します。今回は、前回構築したECS環境をベースに、GitHub ActionsによるCI/CDを設定していきます。
デプロイ対象のリソース
このワークフローでは、以下のリソースをCDKを通じてAWS上にデプロイします。
- ECS Fargateクラスター:コンテナを実行する基盤(CDKで定義済み)
- Application Load Balancer(ALB):外部からのトラフィックを処理・分配
- VPCとネットワークリソース:マルチAZ構成の仮想ネットワーク環境
- GitHub Actions用IAMロール:GitHub ActionsからAWSにアクセスするためのロール(Assume Roleを利用)
前提条件
作業を始める前に、以下の準備が整っていることを確認してください。
- GitHubアカウント
- AWSアカウント
- CDKで作成したプロジェクトが、GitHubリポジトリにプッシュ済みであること
1. GitHub ActionsからAssumeできるIAMロールをCDKで作成する
GitHub ActionsがAWSリソースにアクセスするには、IAMロールの権限を一時的に引き受ける(Assumeする)必要があります。 この仕組みは「Assume Role」と呼ばれ、GitHubが発行するOIDC(OpenID Connect)トークンを信頼情報として利用します。
Assume Roleとは、信頼された外部のサービスやユーザーが、一時的にIAMロールの権限を引き受け、AWSリソースを操作できる仕組みです。アクセスキーの発行が不要なため、セキュリティリスクを低減できます。
ここでは、CDKを使って以下の構成を持つIAMロールを作成します。
- GitHubのOIDCプロバイダーを登録
- 特定のGitHubリポジトリのみからAssume可能な信頼ポリシーを設定
- CDK・ECSなどのデプロイに必要なポリシーを付与
- ロールのARNをCloudFormation出力(後続の設定で利用)
以下が、上記をCDKで実装したスタックのコードです。
import * as cdk from 'aws-cdk-lib';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Construct } from 'constructs';
const GITHUB_USERNAME = "your_user_name"
const REPOSITORY_NAME = "your_repository_name"
export class GitHubActionsRoleStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// GitHubのOIDCプロバイダーを作成
const githubProvider = new iam.OpenIdConnectProvider(this, 'GitHubProvider', {
url: 'https://token.actions.githubusercontent.com',
clientIds: ['sts.amazonaws.com'],
// ref) https://github.blog/changelog/2023-06-27-github-actions-update-on-oidc-integration-with-aws/thumbprints: ['6938fd4d98bab03faadb97b34396831e3780aea1'],
});
// github actions からの使用を許可したIAMロールを作成
const githubActionsRole = new iam.Role(this, 'GitHubActionsRole', {
assumedBy: new iam.WebIdentityPrincipal(githubProvider.openIdConnectProviderArn, {
StringEquals: {
'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com',
},
StringLike: {
'token.actions.githubusercontent.com:sub': `repo:${GITHUB_USERNAME}/${REPOSITORY_NAME}:*`
}
}),
description: 'Role for GitHub Actions to deploy CDK stack',
});
// CDKデプロイに必要な権限を付与
githubActionsRole.addToPolicy(
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [
'cloudformation:*',
'ecs:*',
'ecr:*',
'iam:*',
'logs:*',
's3:*',
'vpc:*',
],
resources: ['*'],
})
);
// ロールのARNを出力new cdk.CfnOutput(this, 'RoleArn', {
value: githubActionsRole.roleArn,
description: 'ARN of the GitHub Actions role',
});
}
}
このCDKスタックをデプロイするには、以下のコマンドを実行します。
cdk deploy GitHubActionsRoleStack --profile ${YOUR_PROFILE}
デプロイが完了すると、ロールのARNが出力されます。このARNは、GitHub Actionsのワークフローファイルで使用します。
2. GitHub Actionsのワークフローファイルを作成する
IAMロールの準備ができたら、GitHub上でCDKを自動実行するためのワークフローファイルを作成します。GitHubリポジトリの.github/workflowsディレクトリに deploy.ymlという名前で以下の内容を記述してください。このファイルは、mainブランチへのプッシュや手動実行によってCDKスタックのデプロイ処理をトリガーする役割を持ちます。
name: Deploy CDK Stack
on:
push:
branches:
- main
workflow_dispatch:
permissions:
id-token: write
contents: read
jobs:
deploy:
defaults:
run:
working-directory: ${cdkプロジェクトのディレクトリを指定}
runs-on: ubuntu-latest
environment:
name: main
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ap-northeast-1
- name: CDK Deploy
run: npx cdk deploy --all --require-approval never
このワークフローファイルの主なポイントは以下の通りです。
- トリガー設定(on)
mainブランチへのpushや、手動実行(workflow_dispatch)がトリガーになります。 - 権限設定(permissions)
id-token: write:OIDCトークンを生成するために必要。
contents: read:GitHubリポジトリのコードにアクセスするために必要。 - Node.js環境(setup-node)
CDKを使うために必要なNode.jsをバージョン20でセットアップします。 - AWS認証情報(configure-aws-credentials)
CDKで作成したIAMロールのARNを使ってAWSに認証します。このARNは次のステップで GitHub Secrets に登録します。 - CDKデプロイ(cdk deploy)
–require-approval never を指定することで、手動承認なしにデプロイが可能になります。
3. GitHub SecretsにIAMロールのARNを登録する
CDKで作成したIAMロールのARNは、GitHub ActionsのワークフローでAWSにアクセスするために使用されます。このARNをGitHub上に安全に保持するため、Secrets(シークレット)機能を使って登録します。
設定手順
- GitHubリポジトリの「Settings」タブを開く
- 「Secrets and variables」→「Actions」を選択
- 「New repository secret」をクリック
- 名前をAWS_ROLE_ARN、値をCDKで出力されたロールのARNを設定
項目 | 入力内容 |
Name | AWS_ROLE_ARN(←固定名、YAMLファイル内で参照) |
Secret | CDKで出力されたIAMロールのARN(例:arn:aws:iam::123456789012:role/GitHubActionsRole) |
これでGitHub側の準備は完了です。
続いて、実際のワークフロー内での呼び出し方法を見てみましょう。
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
SecretsはGitHub Actionsの環境内でのみ使用でき、外部に漏れないよう安全に管理されます。
4.デプロイの実行
準備した deploy.ymlファイルをmainブランチにプッシュすると、GitHub Actionsが自動的に実行され、CDKスタックがデプロイされます。デプロイの進行状況は、GitHubリポジトリの「Actions」タブから確認できます。
各ステップのログを見ることで、実行状況やエラーの有無を確認できます。

セキュリティ上の注意点
GitHub Actionsは便利な自動化ツールですが、AWSにアクセスできる設定を行う場合は特に注意が必要です。万が一、GitHubアカウントが乗っ取られた場合、AWS環境への不正アクセスにつながるリスクがあります。
以下のポイントを押さえて、最小権限の原則(必要な操作だけを許可)を守るようにしましょう。
セキュリティ上のチェックポイント
- IAMロールの使用(Assume Role)
アクセスキーを使わず、IAMロールを使って一時的に権限を付与することで、漏えいリスクを減らせます。 - OIDCの活用とトークン制御
GitHub Actionsからの認証にはOIDCを利用します。トークンの有効期限を制限することで、安全性を高められます。 - Secretsで機密情報を管理
環境変数や認証情報は、リポジトリの「Secrets」で安全に管理しましょう。ステージングや本番など、環境ごとに値を分けるのも有効です。
こうしたセキュリティ対策を踏まえて、次は本番環境のアクセス権限管理について見ていきましょう。
本番環境へのアクセスを安全に管理する
GitHub ActionsとAssume Roleの仕組みを使うことで、AWS本番環境へのアクセスをより安全かつ効率的に管理できます。
この方法を使うことで、以下のようなメリットがあります。
アクセス管理で得られる3つのメリット
- アクセス権の分離ができる
開発者はGitHubリポジトリにだけアクセスすればよく、AWSコンソールやIAMユーザーへの直接アクセスは不要になります。
→ セキュリティリスクの低減に繋がります。 - 監査ログが取りやすくなる
GitHub Actionsの実行履歴と、AWSのCloudTrailを組み合わせることで、「誰が、いつ、何をデプロイしたか」を可視化できます。
→ トラブル時の調査やコンプライアンス対応にも有効です。 - 外注先とも安全に協業できる
GitHubリポジトリのアクセス権だけを共有すれば、外注先にも開発やデプロイを任せることができます。
→ AWSアカウントへの直接アクセスを避けられるため、安全性が高まります。
まとめ
この記事では、GitHub Actionsを使ってCDKプロジェクトを自動デプロイする方法を紹介しました。
ポイントは以下の通りです。
- Assume RoleとOIDCを活用することで、アクセスキーを使わず、安全にAWSへ認証できます。
- GitHub Actionsからのデプロイにより、手動操作なしでインフラ構築を自動化できます。
- AWSのアクセス権を渡さずに、外注先やチームメンバーと安全に開発・運用ができます。
このように、GitHubとCDKを組み合わせることで、セキュリティと効率を両立したインフラ管理が実現できます。ぜひご自身のプロジェクトにも取り入れてみてください。
今回紹介した構成をベースに、Slack通知やテストの自動実行など、より実践的なCI/CDパイプラインにも発展させていくことができます。