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 のインストール**

```sh
npm install -g aws-cdk
```

- **CDK プロジェクトの作成**

```sh
mkdir my-cdk-app && cd my-cdk-app
cdk init app --language=typescript
```

## AWS CDK の基本概念

### 1. **スタック（Stack）**
AWS CDK では、CloudFormation のスタックに相当する単位として「Stack」を定義します。

```typescript
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 つ以上のスタックを含むエントリーポイントとなります。

```typescript
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 バケットの作成**

```typescript
new s3.Bucket(this, 'MySecureBucket', {
  versioned: true,
  encryption: s3.BucketEncryption.S3_MANAGED
});
```

### 2. **Lambda 関数のデプロイ**

```typescript
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 の統合**

```typescript
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 の定期実行**

```typescript
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 テーブルの作成**

```typescript
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 トピックの作成とサブスクライブ**

```typescript
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 キューの作成**

```typescript
import * as sqs from 'aws-cdk-lib/aws-sqs';

new sqs.Queue(this, 'MyQueue', {
  visibilityTimeout: cdk.Duration.seconds(30),
});
```

### 8. **VPC の作成**

```typescript
import * as ec2 from 'aws-cdk-lib/aws-ec2';

new ec2.Vpc(this, 'MyVpc', {
  maxAzs: 2
});
```

### 9. **IAM ロールの作成と Lambda へのアタッチ**

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