GitHub Actions と OIDC 認証で AWS CDK のデプロイを自動化する

GitHub Actions と OIDC 認証で AWS CDK のデプロイを自動化する

2026.03.27

はじめに

お疲れ様です。あきとです。
最近、開発環境で AWS CDK のデプロイを手動で実行していました。cdk deploy を叩くだけとはいえ、やはり手動だと忘れたりミスしたりするもの。そこで GitHub Actions と組み合わせて、main ブランチへの push で自動デプロイされる CI/CD パイプラインを構築したので、手順を忘れないように残しておきます。

今回デプロイする構成は例としてシンプルな CRUD API です。これを CDK で定義し、GitHub Actions で自動デプロイする流れを構築します。

やってみた

CDK スタックの定義(例)

今回は例として、Lambda + API Gateway + DynamoDB で構成する シンプルな CRUD API のスタックを使います。スタックの中身は ご自身のプロジェクトに合わせて置き換えてください。

スタック定義のサンプルコード(src/lambda/items.tsは別途作成)

import * as cdk from "aws-cdk-lib";
import * as apigw from "aws-cdk-lib/aws-apigateway";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
import * as lambda from "aws-cdk-lib/aws-lambda";
import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
import * as path from "path";

export class CdkGithubActionsStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const table = new dynamodb.Table(this, "ItemsTable", {
      partitionKey: { name: "id", type: dynamodb.AttributeType.STRING },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    const itemsFunction = new NodejsFunction(this, "ItemsFunction", {
      runtime: lambda.Runtime.NODEJS_22_X,
      entry: path.join(__dirname, "../src/lambda/items.ts"),
      handler: "handler",
      environment: {
        TABLE_NAME: table.tableName,
      },
    });

    table.grantReadWriteData(itemsFunction);

    const api = new apigw.RestApi(this, "ItemsApi", {
      restApiName: "Items Service",
      endpointTypes: [apigw.EndpointType.REGIONAL],
      defaultCorsPreflightOptions: {
        allowOrigins: apigw.Cors.ALL_ORIGINS,
        allowMethods: apigw.Cors.ALL_METHODS,
      },
    });

    const lambdaIntegration = new apigw.LambdaIntegration(itemsFunction);

    const items = api.root.addResource("items");
    items.addMethod("GET", lambdaIntegration);
    items.addMethod("POST", lambdaIntegration);

    const item = items.addResource("{id}");
    item.addMethod("GET", lambdaIntegration);
    item.addMethod("PUT", lambdaIntegration);
    item.addMethod("DELETE", lambdaIntegration);

    new cdk.CfnOutput(this, "ApiUrl", {
      value: api.url,
      description: "API Gateway URL",
    });

    new cdk.CfnOutput(this, "TableName", {
      value: table.tableName,
      description: "DynamoDB Table Name",
    });
  }
}

GitHub Actions ワークフローの作成

.github/workflows/deploy.yml を作成します。ここでは シンプルに main ブランチへの push をトリガーとしていますが、プロジェクトに応じてトリガーやジョブの内容は変更してください。

name: deploy

on:
  push:
    branches:
      - main

permissions:
  contents: read
  id-token: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: pnpm/action-setup@v5
        with:
          version: 10

      - uses: actions/setup-node@v6
        with:
          node-version: 22
          cache: pnpm

      - run: pnpm install --frozen-lockfile

      - uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: ${{secrets.AWS_ROLE_ARN }}
          aws-region: ap-northeast-1

      - run: pnpm cdk deploy --all --require-approval never

ワークフローの中身は プロジェクトによって異なりますが、以下の 2点はどの構成でも共通で必要です。

  • permissions.id-token: write: GitHub Actions が OIDC トークンを発行するために必須
  • aws-actions/configure-aws-credentials: OIDC トークンを使って AWS の IAM ロールを引き受ける

この 2つが GitHub Actions と AWS をつなぐ要になります。続いて、AWS 側の設定を見ていきましょう。

デプロイ用の IAM ロール設定

GitHub Actions から AWS へデプロイするには、OIDC(OpenID Connect)を使った認証が必要です。アクセスキーを使わず、一時的な認証情報でデプロイできるため セキュリティ面でも優れています。

以下の 3ステップで設定していきます。

1. OIDC プロバイダーの作成

AWS マネジメントコンソールで IAM > ID プロバイダー > プロバイダを追加 に進みます。

項目
プロバイダのタイプ OpenID Connect
プロバイダの URL https://token.actions.githubusercontent.com
対象者(Audience) sts.amazonaws.com

2. IAM ポリシーの作成

CDK がデプロイ時に使用するロールを引き受けるための ポリシーを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AssumeCDKRoles",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "iam:ResourceTag/aws-cdk:bootstrap-role": [
            "image-publishing",
            "file-publishing",
            "deploy",
            "lookup"
          ]
        }
      }
    }
  ]
}

Condition で CDK の bootstrap ロールのみに制限しているため、必要最低限の権限に抑えられています。

3. IAM ロールの作成

IAM > ロール > ロールを作成 から、以下の手順でロールを作成します。

信頼されたエンティティの設定

  • 「ウェブアイデンティティ」を選択
  • ID プロバイダー: token.actions.githubusercontent.com
  • Audience: sts.amazonaws.com
  • GitHub organization: お使いの GitHub ユーザー名

許可ポリシーの追加

先ほど作成した AssumeCDKRoles ポリシーをアタッチし、ロール名を github-actions-cdk-deploy として作成します。

作成後のロールは 以下のようになっているはずです。

許可ポリシー

信頼されたエンティティ

GitHub リポジトリへの設定

最後に、GitHub リポジトリで シークレットを登録します。

Settings > Secrets and variables > Actions に移動し、以下を追加してください。

  • AWS_ROLE_ARN: 作成した IAM ロールの ARN

GitHub Secrets 設定画面

デプロイしてみる

ここまでの設定が完了したら、main ブランチに push してみましょう。GitHub Actions が起動し、CDK によるデプロイが自動で実行されます。

CloudFormation のデプロイ画面

CloudFormation のコンソールを確認すると、スタックが正常にデプロイされていました。API Gateway の URL や DynamoDB のテーブル名も、Outputs タブから確認できます。

まとめ

今回は AWS CDK と GitHub Actions を組み合わせて、main ブランチへの push で自動デプロイされる CI/CD パイプラインを構築しました。

OIDC を使った認証は アクセスキーが不要で、セキュリティ面でも安心です。手動デプロイの手間から解放されるのは、やはりいいものですね。

本記事では シンプルな構成にしましたが、実際のプロジェクトでは ステージング環境の追加やテストの組み込みなど、ワークフローを拡張していくとよいでしょう。

本ブログが どなたかの参考になれば幸いです。

参考資料


クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。

運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。

当社は様々な職種でメンバーを募集しています。

「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事