はじめに
AWS CDKで書いたリソースをLocalStackで動かすところまでを行います。
手順
便利なcdklocalがあるのでそちらを使いましょう。
これを用いることで、楽にCDKをLocalstack上にデプロイできます。
npm install -g aws-cdk-local aws-cdk
cdk init app --language=python local-test でCDKを開始しましょう。
次に、PythonでCDKのリソースを記述します。
今回は1つのスタックにまとめてざっくり用意しました。
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を用意します。
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にデプロイできます。
docker compose up -d
cdklocal bootstrap
# diff確認
cdklocal diff
cdklocal deploy
デプロイ後の確認
デプロイ完了すると、localstack提供のawslocalを使用して、awslocal sqs list-queuesのように、コマンドベースで確認することができます。
また、別の方法として、LocalstackのWEBダッシュボードの「Resource Browser」から、確認できます。
例として、S3を見たい場合は、 https://app.localstack.cloud/inst/default/resources/s3 といった感じです。
つまづきポイント
SQSを使用する場合に、Localstack 1系だとうまく動作しない
このあたりのお話です。
こちらを踏まえて、今回はLocalstack3系を使用することで、該当現象を回避しました。
EAGER_SERVICE_LOADING と cdklocal
CDKの前提条件として、CloudFormationなどが必要です。
そのため、EAGER_SERVICE_LOADING=1 とする場合は、SERVICES=sts,ssm,cloudformation,iam のように、これら4つを指定するようにしましょう。
PERSISTENCE で永続化しない?
Localstack Pro版のみかと思います。
このあたりで議論されているようです。
そのため、コミュニティ版で実施する際は永続化されないため、都度 cdklocal bootstrap から開始することになります。
最後に
以上です。
たのしいCDKライフを!
LGTMいただけると、励みになります。
よろしくお願いします。

