AWS CDKの設定方法

AWS

AWS CDKは、TypeScript・Python・Javaなどのプログラム言語でAWS環境を定義し、最終的にCloudFormationとしてデプロイするIaCツールです。以下は、AWS CDK v2+TypeScript+Windows PowerShellの標準手順です。CDK v1はサポート終了済みなので、CDK v2を使用します。

1. 必要なツールをインストール

事前に以下を用意します。

  • AWSアカウント
  • AWS CLI v2
  • Node.js
  • npm
  • Git
  • Visual Studio Code
  • AWS CDK CLI

バージョン確認:

aws --version
node --version
npm --version
git --version

CDK CLIをインストールします。

npm install -g aws-cdk

確認:

cdk --version

CDKのTypeScriptプロジェクトでは、Node.js、CDK Toolkit、TypeScript環境が必要です。


2. AWS認証を設定

推奨:IAM Identity Center(AWS SSO)

会社環境では、アクセスキーをPCに保存する方式より、IAM Identity Centerを推奨します。

aws configure sso

入力例:

SSO session name: socioak-sso
SSO start URL: https://xxxxxxxx.awsapps.com/start
SSO region: ap-northeast-1
SSO registration scopes: sso:account:access

その後、対象アカウントとロールを選択し、プロファイル名を設定します。

CLI default client Region: ap-northeast-1
CLI default output format: json
CLI profile name: dev

ログイン:

aws sso login --profile dev

確認:

aws sts get-caller-identity --profile dev

結果例:

{
  "UserId": "AROAXXXXXXXXXXXXX:user@example.com",
  "Account": "123456789012",
  "Arn": "arn:aws:sts::123456789012:assumed-role/AWSAdministratorAccess/user@example.com"
}

CDK CLIを利用するには、AWS認証情報の設定が必要です。認証方式は組織のユーザー管理方式に合わせて選択します。

アクセスキーを使う場合

aws configure --profile dev
AWS Access Key ID: AKIAxxxxxxxx
AWS Secret Access Key: xxxxxxxxx
Default region name: ap-northeast-1
Default output format: json

ただし、本番運用では長期アクセスキーを避け、SSOまたは一時認証情報を利用する方が安全です。


3. CDKプロジェクトを作成

作業フォルダを作成します。

mkdir C:\work\aws-cdk
cd C:\work\aws-cdk

mkdir sample-infra
cd sample-infra

TypeScriptプロジェクトを初期化します。

cdk init app --language typescript

主な構成は次のようになります。

sample-infra/
├─ bin/
│  └─ sample-infra.ts
├─ lib/
│  └─ sample-infra-stack.ts
├─ test/
├─ cdk.json
├─ package.json
├─ tsconfig.json
└─ README.md

依存関係を確認します。

npm install

コンパイル確認:

npm run build

4. AWSアカウントとリージョンを設定

bin/sample-infra.tsを次のように設定します。

#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { SampleInfraStack } from '../lib/sample-infra-stack';

const app = new cdk.App();

new SampleInfraStack(app, 'Sok-Dev-SampleInfraStack', {
  env: {
    account: process.env.CDK_DEFAULT_ACCOUNT,
    region: process.env.CDK_DEFAULT_REGION ?? 'ap-northeast-1',
  },
  description: 'Sok Dev sample infrastructure stack',
});

app.synth();

この方式では、--profile devで選択したAWSアカウントが使用されます。

アカウントを固定する場合は次のようにも書けます。

env: {
  account: '123456789012',
  region: 'ap-northeast-1',
},

ただし、Gitリポジトリ内へのアカウントIDの直接記載は、マルチアカウント運用では避けた方が管理しやすいです。


5. CDK Bootstrapを実行

初めてCDKを利用するAWSアカウント・リージョンでは、Bootstrapが必要です。

アカウントIDを確認:

aws sts get-caller-identity `
  --profile dev `
  --query Account `
  --output text

Bootstrap実行:

cdk bootstrap aws://123456789012/ap-northeast-1 --profile dev

成功すると、CloudFormationに次のスタックが作成されます。

CDKToolkit

Bootstrapでは、CDKがデプロイに使用する以下のようなリソースが準備されます。

  • S3アセット保管バケット
  • ECRリポジトリ
  • デプロイ用IAMロール
  • CloudFormation実行用IAMロール

CDKを使用するAWSアカウントとリージョンの組み合わせごとにBootstrapが必要です。

例えばdev、stg、prodが別アカウントなら、それぞれ実施します。

cdk bootstrap aws://111111111111/ap-northeast-1 --profile dev
cdk bootstrap aws://222222222222/ap-northeast-1 --profile stg
cdk bootstrap aws://333333333333/ap-northeast-1 --profile prod

6. 最初のAWSリソースを定義

例として、暗号化・バージョニング・パブリックアクセス禁止を設定したS3バケットを作ります。

lib/sample-infra-stack.ts

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

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

    const bucket = new s3.Bucket(this, 'ApplicationBucket', {
      bucketName: `sok-dev-sample-${this.account}`,

      encryption: s3.BucketEncryption.S3_MANAGED,
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      enforceSSL: true,
      versioned: true,

      removalPolicy: cdk.RemovalPolicy.RETAIN,
      autoDeleteObjects: false,
    });

    new cdk.CfnOutput(this, 'ApplicationBucketName', {
      value: bucket.bucketName,
      description: 'Application S3 bucket name',
    });
  }
}

本番データを保持するバケットでは、通常次の設定を推奨します。

removalPolicy: cdk.RemovalPolicy.RETAIN,
autoDeleteObjects: false,

これにより、CDKスタックを削除してもS3バケットを自動削除しません。


7. CloudFormationテンプレートを生成

cdk synth --profile dev

生成結果は通常、次のフォルダに出力されます。

cdk.out/

この段階ではAWS環境への変更はありません。


8. 変更内容を確認

既存環境との差分を確認します。

cdk diff --profile dev

本番環境では、必ず次の順番で確認します。

npm run build
↓
cdk synth
↓
cdk diff
↓
レビュー
↓
cdk deploy

9. デプロイ

cdk deploy --profile dev

IAM変更の承認確認が表示される場合があります。

CI/CDなどで確認を省略する場合:

cdk deploy `
  --profile dev `
  --require-approval never

ただし、ローカルから本番環境へデプロイするときは、確認を省略しない方が安全です。

スタック名を指定する場合:

cdk deploy Sok-Dev-SampleInfraStack --profile dev

すべてのスタックをデプロイする場合:

cdk deploy --all --profile dev

10. 削除

cdk destroy Sok-Dev-SampleInfraStack --profile dev

S3やRDSなどでRemovalPolicy.RETAINを設定している場合、スタックを削除しても対象リソースは残ります。


環境別の設定方法

dev・stg・prodを管理する場合は、CDK Contextまたは設定ファイルで分けます。

cdk.json

{
  "app": "npx ts-node --prefer-ts-exts bin/sample-infra.ts",
  "context": {
    "dev": {
      "prefix": "Sok-Dev",
      "vpcCidr": "10.200.0.0/16",
      "natGatewayCount": 1
    },
    "stg": {
      "prefix": "Sok-Stg",
      "vpcCidr": "10.210.0.0/16",
      "natGatewayCount": 1
    },
    "prod": {
      "prefix": "Sok-Prd",
      "vpcCidr": "10.220.0.0/16",
      "natGatewayCount": 2
    }
  }
}

デプロイ時:

cdk deploy `
  --context env=dev `
  --profile dev

コード側:

const environmentName =
  this.node.tryGetContext('env') ?? 'dev';

const environmentConfig =
  this.node.tryGetContext(environmentName);

if (!environmentConfig) {
  throw new Error(
    `Environment configuration not found: ${environmentName}`,
  );
}

const prefix = environmentConfig.prefix;
const vpcCidr = environmentConfig.vpcCidr;

ただし、パスワード、APIキー、DB接続情報などの秘密情報をcdk.jsonへ記載してはいけません。秘密情報は次を使用します。

  • AWS Secrets Manager
  • SSM Parameter Store
  • CI/CDのシークレット管理
  • GitHub Actions Secrets
  • CodeBuild環境変数のSecrets Manager参照

推奨ディレクトリ構成

自治体向け・複数環境の本番構成では、次のように分割すると管理しやすいです。

infrastructure/
├─ bin/
│  └─ infrastructure.ts
├─ config/
│  ├─ dev.ts
│  ├─ stg.ts
│  ├─ demo.ts
│  └─ prod.ts
├─ lib/
│  ├─ network-stack.ts
│  ├─ security-stack.ts
│  ├─ database-stack.ts
│  ├─ ecs-stack.ts
│  ├─ cloudfront-stack.ts
│  ├─ monitoring-stack.ts
│  └─ backup-stack.ts
├─ constructs/
│  ├─ secure-bucket.ts
│  ├─ ecs-service.ts
│  └─ standard-alarm.ts
├─ test/
├─ cdk.json
├─ package.json
└─ tsconfig.json

最初から一つの巨大なStackにせず、次の単位で分けるのが適切です。

Stack主なリソース
NetworkStackVPC、Subnet、Route、NAT Gateway
SecurityStackSecurity Group、WAF、KMS
DatabaseStackAurora、RDS、ElastiCache
ApplicationStackECS、ALB、ECR
EdgeStackCloudFront、Route 53、ACM
MonitoringStackCloudWatch、SNS、Logs
BackupStackAWS Backup、Vault、コピー設定

最低限使用するコマンド一覧

# バージョン
cdk --version

# プロジェクト作成
cdk init app --language typescript

# 認証確認
aws sts get-caller-identity --profile dev

# 初期準備
cdk bootstrap aws://ACCOUNT_ID/ap-northeast-1 --profile dev

# コンパイル
npm run build

# テンプレート生成
cdk synth --profile dev

# 差分確認
cdk diff --profile dev

# デプロイ
cdk deploy --profile dev

# 全スタックデプロイ
cdk deploy --all --profile dev

# 削除
cdk destroy --profile dev

まずは、**AWS CLI認証 → CDKインストール → cdk initcdk bootstrapcdk synthcdk diffcdk deploy**の順で進めれば、基本設定が完了します。

エラーの場合

PS C:\Windows\system32> npm –version
npm : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\nodejs\npm.ps1 を読み込むことが
できません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してくだ
さい。
発生場所 行:1 文字:1

  • npm –version
  • ~~~
    • CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
    • FullyQualifiedErrorId : UnauthorizedAccess
      PS C:\Windows\system32> Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
      PS C:\Windows\system32> npm –version
      11.13.0
      PS C:\Windows\system32> node –version
      v24.16.0

コメント