🌱
AWS CDK / GitHub Actions 単一アカウントで環境を分けたデプロイ
単独 AWS アカウント内で CDK による dev / prd 環境を実現したい場合の構成を記述します。dev 環境は欲しいけど、dev 専用の AWS アカウントまではいらないときに使えます。
動作
ブランチ | GitHub | スタック | CDK | リソース名 |
---|---|---|---|---|
develop | プルリク | dev | diff | - |
develop | マージ | dev | deploy | dev-XXX |
master | プルリク | prd | diff | - |
master | マージ | prd | deploy | prd-XXX |
図
コード
bin
スタックの構成を記述します。
bin/github-actions-cdk-env.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { MyStack } from '../lib/github-actions-cdk-env-stack';
const app = new cdk.App();
// 開発環境のスタック
new MyStack(app, 'DevStack', {
envName: 'dev',
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION
},
});
// 本番環境のスタック
new MyStack(app, 'PrdStack', {
envName: 'prd',
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION
},
});
app.synth();
lib
ここではS3 をデプロイさせています。
lib/github-actions-cdk-env-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';
// 環境を定義するインターフェース
export interface EnvProps extends cdk.StackProps {
envName: string;
}
export class MyStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: EnvProps) {
super(scope, id, props);
// S3バケットの作成
new s3.Bucket(this, 'MyBucket', {
bucketName: `${props.envName}-my-unique-bucket-name-xx`,
encryption: s3.BucketEncryption.S3_MANAGED,
removalPolicy: cdk.RemovalPolicy.DESTROY
});
}
}
GitHub Actions
.github/workflows/cdk.yml
name: cdk
on:
push:
branches:
- develop
- master
pull_request:
branches:
- develop
- master
jobs:
aws_cdk:
runs-on: ubuntu-latest
env:
AWS_REGION: "ap-northeast-1"
permissions:
id-token: write
contents: read
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup dependencies
run: npm ci
- name: Assume Role
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: ${{ env.AWS_REGION }}
- name: CDK Diff (Pull Request)
if: github.event_name == 'pull_request'
run: |
if [[ ${{ github.base_ref }} == "develop" ]]; then
npx cdk diff DevStack
elif [[ ${{ github.base_ref }} == "master" ]]; then
npx cdk diff PrdStack
fi
- name: CDK Deploy (Push)
if: github.event_name == 'push'
run: |
if [[ ${{ github.ref }} == "refs/heads/develop" ]]; then
npx cdk deploy DevStack --require-approval never
elif [[ ${{ github.ref }} == "refs/heads/master" ]]; then
npx cdk deploy PrdStack --require-approval never
fi
参考リポジトリ
以上です☺️
Discussion