🌱

AWS CDK / GitHub Actions 単一アカウントで環境を分けたデプロイ

2024/10/12に公開

単独 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

参考リポジトリ

https://github.com/hiyanger/hiyanger-github-actions-cdk-env

以上です☺️

アイレット株式会社

Discussion