はじめに
AWS Cloud Development Kit(AWS CDK)は、プログラミング言語を用いてクラウドインフラをコードとして定義できる強力なツールです。
CloudFormation の利便性を保ちつつ、より柔軟で可読性の高いインフラ管理が可能になります。
本記事では、AWS CDK の基本概念から具体的な活用例までを解説し、効率的なインフラ管理を実現する方法を紹介します。
対象読者
- AWS 環境のインフラをコード化したいエンジニア
- CloudFormation を利用しているが、より柔軟な管理をしたい方
- AWS CDK の導入を検討している技術者
- DevOps や IaC(Infrastructure as Code)に興味がある方
- AWS CDK を活用した CI/CD パイプラインを構築したい方
事前準備
AWS CDK を使用するためには、以下の環境を準備する必要があります。
- AWS アカウント(AWS リソースをデプロイするため)
- Node.js(バージョン 18 以上推奨)
- AWS CLI(適切な認証情報の設定が必要)
- AWS CDK のインストール
npm install -g aws-cdk
- CDK プロジェクトの作成
mkdir my-cdk-app && cd my-cdk-app
cdk init app --language=typescript
AWS CDK の基本概念
1. スタック(Stack)
AWS CDK では、CloudFormation のスタックに相当する単位として「Stack」を定義します。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class MyStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new s3.Bucket(this, 'MyBucket', {
versioned: true
});
}
}
2. アプリ(App)
CDK アプリは 1 つ以上のスタックを含むエントリーポイントとなります。
import * as cdk from 'aws-cdk-lib';
import { MyStack } from './my-stack';
const app = new cdk.App();
new MyStack(app, 'MyStack');
app.synth();
3. コンストラクト(Construct)
リソースの再利用を可能にする単位が「Construct」です。
AWS の各リソース(S3、Lambda など)は基本的にコンストラクトとして提供されます。
AWS CDK の活用例
1. S3 バケットの作成
new s3.Bucket(this, 'MySecureBucket', {
versioned: true,
encryption: s3.BucketEncryption.S3_MANAGED
});
2. Lambda 関数のデプロイ
import * as lambda from 'aws-cdk-lib/aws-lambda';
new lambda.Function(this, 'MyLambda', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda')
});
3. API Gateway と Lambda の統合
import * as apigw from 'aws-cdk-lib/aws-apigateway';
const api = new apigw.RestApi(this, 'MyApi');
const lambdaIntegration = new apigw.LambdaIntegration(myLambda);
api.root.addMethod('GET', lambdaIntegration);
4. EventBridge を使用した Lambda の定期実行
import * as events from 'aws-cdk-lib/aws-events';
import * as targets from 'aws-cdk-lib/aws-events-targets';
const rule = new events.Rule(this, 'ScheduledRule', {
schedule: events.Schedule.rate(cdk.Duration.hours(1)), // 1時間ごとに実行
});
rule.addTarget(new targets.LambdaFunction(myLambda));
5. DynamoDB テーブルの作成
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
new dynamodb.Table(this, 'MyTable', {
partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
});
6. SNS トピックの作成とサブスクライブ
import * as sns from 'aws-cdk-lib/aws-sns';
import * as subs from 'aws-cdk-lib/aws-sns-subscriptions';
const topic = new sns.Topic(this, 'MyTopic');
topic.addSubscription(new subs.EmailSubscription('example@example.com'));
7. SQS キューの作成
import * as sqs from 'aws-cdk-lib/aws-sqs';
new sqs.Queue(this, 'MyQueue', {
visibilityTimeout: cdk.Duration.seconds(30),
});
8. VPC の作成
import * as ec2 from 'aws-cdk-lib/aws-ec2';
new ec2.Vpc(this, 'MyVpc', {
maxAzs: 2
});
9. IAM ロールの作成と Lambda へのアタッチ
import * as iam from 'aws-cdk-lib/aws-iam';
const role = new iam.Role(this, 'MyLambdaRole', {
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com')
});
role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'));
new lambda.Function(this, 'MyLambdaWithRole', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
role: role
});
AWS CDK のメリット
- プログラムとして記述可能 → 条件分岐やループを活用できる
- モジュール化と再利用 → Construct を活用してコードの再利用性を向上
- CloudFormation と互換性あり → 既存の CF テンプレートと統合可能
- CI/CD との統合が容易 → GitHub Actions や AWS CodePipeline と連携しやすい
まとめ
AWS CDK を活用すると、より柔軟で効率的な AWS インフラ管理が可能になります。
本記事で紹介した活用例を参考に、AWS CDK を活用したインフラ管理を実践してみてください!