AWS CDK に入門すっぞ①

こんにちは。
毎日を必死にしがみついて生きている、ポンコツエンジニアです。

業務でAWS CDK に触れる機会がありましたので、
せっかくなら環境構築から触ってみようと思い、備忘録としてこの記事を残します。

## 目的
本記事では、AWS CDKの初期開発環境構築とローカルでdeployができる環境を整備し、typescript で実装をすることを目的とした記事です。

## 前提条件
以下の環境が既に整備されていること
- Node.js
- Docker Compose


## 実行環境
```bash
ProductName:    macOS
ProductVersion: 12.7.1
Node.js:        v20.10.0
npm:            10.2.3
```


## 環境構築

### LocalStack用プロファイル設定
```bash
aws configure --profile localstack
```

```:aws configure --profile localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: 
Default output format [None]: 

```
プロファイルだけ作成する必要があるので IDなどの情報は適当で良いです。
※本記事では "dummy" としています。

### ディレクトリ作成 / 移動
```bash
mkdir skillup-study-cdk && cd skillup-study-cdk
```

### CDKプロジェクト作成
```bash
npx aws-cdk@ init app --language typescript
```

### aws-cdk-local インストール
aws-cdk をローカル環境でdeployするためにaws-cdk-localをインストールします。
```bash
npm install aws-cdk-local
```

#### ※注意※
aws-cdk と　aws-cdk-localはグローバルにインストールするのではなく、ローカルにインストールし、npxで呼び出すようにします。
グローバルに入れたCDKとローカルのCDKのバージョンの違いによってエラーになるためです。


### docker-compose.yml 作成
LocalStackをdocker-compose　でローカルのDocker上に立ち上げるためymlファイルを作成します。
```bash
touch docker-compose.yml
```

```yml:docker-compose.yml
version: "3.8"

services:
  test-localstack:
    container_name: test-localstack
    image: localstack/localstack:1.3.1
    ports:
      - 4566:4566
    environment:
      - DEFAULT_REGION=ap-northeast-1
      - DOCKER_SOCK=/var/run/docker.sock
      - DEBUG=1
    volumes:
      - test-localstack:/var/lib/localstack/
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      test-network:

networks:
  test-network:
volumes:
  test-localstack:
```

### LocalStack 起動
ローカル環境へのdeploy時は必ずLocalStackを起動してください
```bash
docker-compose up -d
```

### LocalStack 起動確認
```
localstack status services
```

## S3バケットを作成してローカル環境に向けてデプロイしてみる
LocalStackの起動確認が取れたら、S3バケットを作成して、ローカル環境に向けてデプロイをしてみましょう。

### S3バケットを作成する
#### stackファイルに変更する
```bash
mv lib/skillup-study-cdk-stack.ts lib/stack.ts
```

#### lib/stack.tsの編集
- S3バケットを作成する
```typescript:lib/stack.ts
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as s3 from "aws-cdk-lib/aws-s3";

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

    const bucket = new s3.Bucket(this, "CreateBucket", {
      bucketName: "test-bucket-20240422",
      versioned: true,
    });
  }
}
```

#### bin/skillup-study-cdk.ts の編集
- stack.ts を呼び出す
```typescript:bin/stack.ts
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { SkillUpStudyStack } from '../lib/stack';

const app = new cdk.App();
const prefix = 'Test';
new SkillUpStudyStack(app, `${prefix}SkillUpStudy`);
```

### 一番最初のdeploy前のおまじない
deploy時の一番最初の一回のみ以下のコマンドを実行します。
※cdklocal コマンドでローカル環境にデプロイできます
```bash
npx aws-cdk-local bootstrap
```

### deploy

```bash
npx aws-cdk-local deploy


# 結果

✨  Synthesis time: 4.58s

Stack:  start: Building fd40ed898e39bddce371e56c819a052298f01555434527cf1c0c63ccd2ead45e:current_account-current_region
Stack:  success: Built fd40ed898e39bddce371e56c819a052298f01555434527cf1c0c63ccd2ead45e:current_account-current_region
Stack:  start: Publishing fd40ed898e39bddce371e56c819a052298f01555434527cf1c0c63ccd2ead45e:current_account-current_region
Stack:  success: Published fd40ed898e39bddce371e56c819a052298f01555434527cf1c0c63ccd2ead45e:current_account-current_region
Stack: deploying... [1/1]
Stack: creating CloudFormation changeset...

 ✅  Stack

✨  Deployment time: 5.1s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:000000000000:stack/Stack/dbc0586e

✨  Total time: 9.68s
```

## LocalStackにdeployされたリソースを確認してみる

### aws s3コマンドでS3バケットの確認をする
endpoint にLocalStackのURLを、profileにLocalStack用のprofileを指定します。
```bash
aws s3 ls  --endpoint-url=http://localhost:4566 --profile localstack


# 結果
2024-04-23 09:14:33 cdk-hnb659fds-assets-000000000000-ap-northeast-1    # cdkがstackをdeployするために一時的に資材を格納するために作成されるS3バケット
2024-04-23 09:17:50 test-bucket-20240422                                # cdkで定義した作成対象バケット
```

aws cdk を使ってS3バケットを作成することができました。
これで初期構築は終了です。