cdklocalを用いてAWS CDKをLocalstackにデプロイする

# はじめに

AWS CDKで書いたリソースをLocalStackで動かすところまでを行います。

# 手順

便利な`cdklocal`があるのでそちらを使いましょう。
これを用いることで、楽にCDKをLocalstack上にデプロイできます。

https://docs.localstack.cloud/user-guide/integrations/aws-cdk/


```bash
npm install -g aws-cdk-local aws-cdk
```

`cdk init app --language=python local-test` でCDKを開始しましょう。

次に、PythonでCDKのリソースを記述します。
今回は1つのスタックにまとめてざっくり用意しました。

```python:local_test/local_test_stack.py
from aws_cdk import (
    Duration,
    Stack,
    aws_sqs as sqs,
    aws_s3 as s3,
    aws_dynamodb as dynamodb
)
from constructs import Construct

class LocalTestStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # example resource
        sqs.Queue(
            self, "TestQueue1",
            queue_name='TestQueue1',
            visibility_timeout=Duration.seconds(300),
        )
        sqs.Queue(
            self, "TestQueue2",
            queue_name='TestQueue2',
            visibility_timeout=Duration.seconds(300),
        )

        dynamodb.Table(self, 
            'UserTable',
            table_name='UserTable',
            partition_key=dynamodb.Attribute(
                name="id",
                type=dynamodb.AttributeType.NUMBER
            ),
            sort_key = dynamodb.Attribute(
                name="nickname",
                type=dynamodb.AttributeType.STRING
            ),
        )

        s3.Bucket(self,
            "TestBucket",
            bucket_name='test-bucket',
        )

```

そして、dockerでlocalstackを用意します。

```yaml:docker-compose.yml
services:
    localstack:
        container_name: localstack
        image: localstack/localstack:3
        ports:
            - 4566:4566
            - 4510-4559:4510-4559
        environment:
            - EAGER_SERVICE_LOADING=1
            - SERVICES=sts,ssm,cloudformation,iam,s3,ses,sqs,dynamodb
            - AWS_DEFAULT_REGION=ap-northeast-1
            - PERSISTENCE=1
        volumes:
            - ./localstack/volume:/var/lib/localstack

```

次の手順で、CDKのリソースをlocalstackにデプロイできます。

```bash
docker compose up -d
cdklocal bootstrap
# diff確認
cdklocal diff
cdklocal deploy
```

## デプロイ後の確認

デプロイ完了すると、localstack提供の`awslocal`を使用して、`awslocal sqs list-queues`のように、コマンドベースで確認することができます。

https://github.com/localstack/awscli-local

また、別の方法として、LocalstackのWEBダッシュボードの「Resource Browser」から、確認できます。

例として、S3を見たい場合は、 https://app.localstack.cloud/inst/default/resources/s3 といった感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246336/758f13ed-44f3-750b-8f61-7a1abc118bad.png)


## つまづきポイント

### SQSを使用する場合に、Localstack 1系だとうまく動作しない

このあたりのお話です。

https://github.com/localstack/localstack/issues/9610

こちらを踏まえて、今回はLocalstack3系を使用することで、該当現象を回避しました。

### EAGER_SERVICE_LOADING と cdklocal

CDKの前提条件として、CloudFormationなどが必要です。

そのため、`EAGER_SERVICE_LOADING=1` とする場合は、`SERVICES=sts,ssm,cloudformation,iam` のように、これら4つを指定するようにしましょう。

### PERSISTENCE で永続化しない？

Localstack Pro版のみかと思います。
このあたりで議論されているようです。

https://github-com.translate.goog/localstack/localstack/issues/6281?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc

そのため、コミュニティ版で実施する際は永続化されないため、都度 `cdklocal bootstrap` から開始することになります。

## 最後に

以上です。
たのしいCDKライフを！

LGTMいただけると、励みになります。
よろしくお願いします。