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 | 主なリソース |
|---|---|
| NetworkStack | VPC、Subnet、Route、NAT Gateway |
| SecurityStack | Security Group、WAF、KMS |
| DatabaseStack | Aurora、RDS、ElastiCache |
| ApplicationStack | ECS、ALB、ECR |
| EdgeStack | CloudFront、Route 53、ACM |
| MonitoringStack | CloudWatch、SNS、Logs |
| BackupStack | AWS 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 init → cdk bootstrap → cdk synth → cdk diff → cdk 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
コメント