🌊

CloudFormation より簡単!?AWS CDK で楽々 IaC 実践

に公開

はじめに

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 を活用したインフラ管理を実践してみてください!

Discussion