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(シークレット)機能を使って登録します。

設定手順

  1. GitHubリポジトリの「Settings」タブを開く
  2. 「Secrets and variables」→「Actions」を選択
  3. 「New repository secret」をクリック
  4. 名前をAWS_ROLE_ARN、値をCDKで出力されたロールのARNを設定
項目入力内容
NameAWS_ROLE_ARN(←固定名、YAMLファイル内で参照)
SecretCDKで出力された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パイプラインにも発展させていくことができます。