GitHub Actions と OIDC 認証で AWS CDK のデプロイを自動化する
はじめに
お疲れ様です。あきとです。
最近、開発環境で 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

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

CloudFormation のコンソールを確認すると、スタックが正常にデプロイされていました。API Gateway の URL や DynamoDB のテーブル名も、Outputs タブから確認できます。
まとめ
今回は AWS CDK と GitHub Actions を組み合わせて、main ブランチへの push で自動デプロイされる CI/CD パイプラインを構築しました。
OIDC を使った認証は アクセスキーが不要で、セキュリティ面でも安心です。手動デプロイの手間から解放されるのは、やはりいいものですね。
本記事では シンプルな構成にしましたが、実際のプロジェクトでは ステージング環境の追加やテストの組み込みなど、ワークフローを拡張していくとよいでしょう。
本ブログが どなたかの参考になれば幸いです。
参考資料
- AWS CDK セキュリティのベストプラクティス - AWS 公式ドキュメント
- アマゾン ウェブ サービスでの OpenID Connect の構成 - GitHub 公式ドキュメント
- GitHub Actions で AWS CDK を自動デプロイする方法 - ベアサポート
- CDK x GitHub Actions OIDC でデプロイする - Zenn 参考記事
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました







