Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

LocalstackとcdklocalでつくるCDK開発環境入門

hkusaba
July 06, 2024
1.5k

 LocalstackとcdklocalでつくるCDK開発環境入門

AWS CDK Conference Japan 2024

---

CDK開発中に下記の悩みはありませんか?

開発環境用のAWSリソースの課金が気になる
開発中のAWSリソースの作って壊しての流れが手間
手軽にさわれるAWSリソースの開発環境が欲しい
Localstackを用いると、Docker上に仮想のAWSリソースをエミュレートできます。
このセッションでは、下記についてお話します。

## 話す内容

- Localstackとは?
- cdklocalとは?
- Localstackを使ってみる
- cdklocalを用いて、CDKのスタックをLocalstackにデプロイしてみよう
- Tips
- Localstackのリソースブラウザを活用しよう
- Localstackの無料版と有料版の違いは?

## 対象者

- Localstackを知りたい・始めたい人
- CDKの開発環境に悩んでいる人

## 補足資料

https://qiita.com/hkusaba/items/274bcfb4fbeaeed47cf2

hkusaba

July 06, 2024
Tweet

Transcript

  1. ©Fusic Co., Ltd. 2 草場 裕史 Kusaba Hirofumi • 年齢:

    30 • 普段: AWSやPHPアプリを触って います • 趣味: ゲーム / EDM 本日は福岡より参りました。 初登壇です! よろしくお願いします! 自己紹介 はじめに 株式会社Fusic 所属
  2. ©Fusic Co., Ltd. 3 CONTENTS 目次 1. LocalStackとは? 2. Localstackを使ってみよう

    3. cdklocalとは? 4. cdklocalを使ってみよう 5. LocalstackのTips
  3. ©Fusic Co., Ltd. 4 LocalstackのTips LocalstackとcdklocalでつくるCDK開発環境入門 • Localstackのリソースブラウザ • Localstack

    無料版と有料版の違い • 永続化不可に抗う with CDK ◦ Localstack起動時にcdklocalを実行する話 • Localstackの環境変数の SERVICES
  4. ©Fusic Co., Ltd. 9 LocalStackとは? LocalstackとcdklocalでつくるCDK開発環境入門 Localstackのインストール方法は複数ある • Localstack CLI

    ◦ 公式曰く、もっとも簡単に始められる • Localstack Desktop ◦ GUI操作が可能 • Docker-Compose ◦ 個人的にオススメ ◦ Localstackの環境変数を管理しやすい ◦ 複数環境を管理しやすい • Docker • Helm ◦ k8s向け
  5. ©Fusic Co., Ltd. 10 LocalStackとは? LocalstackとcdklocalでつくるCDK開発環境入門 services: localstack: container_name: localstack

    image: localstack/localstack:3.5 ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 volumes: - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml docker-compose.ymlの例
  6. ©Fusic Co., Ltd. 11 LocalStackとは? LocalstackとcdklocalでつくるCDK開発環境入門 Localstack上のリソース操作は、 AWS CLIや、Localstack社が提供する awslocalコマンドで可能

    # エンドポイントを設定すると、Localstackに対してaws-cliを実行できる aws sqs create-queue --queue-name test-queue --endpoint-url http://localhost:4566 # awslocalをインストール pip install awscli-local # awslocalを使えば、エンドポイントの指定が不要 awslocal sqs create-queue --queue-name test-queue
  7. ©Fusic Co., Ltd. 13 Localstackを使ってみよう LocalstackとcdklocalでつくるCDK開発環境入門 services: localstack: container_name: localstack

    image: localstack/localstack:3.5 ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 volumes: - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml docker-compose.ymlを書いて、 docker compose up を実行
  8. ©Fusic Co., Ltd. 18 cdklocalとは? LocalstackとcdklocalでつくるCDK開発環境入門 Localstack社が提供する cdklocalを用いると、 Localstackに対してCDKを実行することができる ちなみに、

    SAMに対応した samlocal、Terraformに対応した tflocalも ある # インストール npm install -g aws-cdk-local aws-cdk # 実行 cdklocal bootstrap cdklocal deploy
  9. ©Fusic Co., Ltd. 20 cdklocalを使ってみよう LocalstackとcdklocalでつくるCDK開発環境入門 services: localstack: container_name: localstack

    image: localstack/localstack:3.5 ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 volumes: - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml 同様に、docker compose up を実行
  10. ©Fusic Co., Ltd. 21 cdklocalを使ってみよう LocalstackとcdklocalでつくるCDK開発環境入門 from aws_cdk import (

    Duration, Stack, aws_sqs as sqs, aws_s3 as s3, ) from constructs import Construct class CdkLocalTestStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) sqs.Queue( self, "TestQueue1", visibility_timeout=Duration.seconds(300), ) s3.Bucket(self, "TestBucket", bucket_name='test-bucket', ) cdk/stacks/cdk_local_test_stack.py PythonのCDKスタックを準備 ..
  11. ©Fusic Co., Ltd. 24 ここまでのまとめ LocalstackとcdklocalでつくるCDK開発環境入門 Localstackを用いて、 docker上にAWS環境をエミュレート Point 01

    awslocalコマンドで、 Localstackに対してawscliを実行 Point 02 cdklocalを用いて、 Localstackに対してCDKを実行 Point 03
  12. ©Fusic Co., Ltd. 26 LocalstackのTips LocalstackとcdklocalでつくるCDK開発環境入門 • Localstackのリソースブラウザ • Localstack

    無料版と有料版の違い • 永続化不可に抗う with CDK ◦ Localstack起動時にcdklocalを実行する話 • Localstackの環境変数の SERVICES
  13. ©Fusic Co., Ltd. 29 Localstackのリソースブラウザ LocalstackとcdklocalでつくるCDK開発環境入門 Localstack上のリソースは、 awslocalを用いて各サービスの describeコマンドなどで確認できる。 ただ、コマンド連発はシンドイ

    ... => Localstack上のAWSリソースがビジュアライズされる、 リソースブラウザや Localstack Desktopを使おう! リソースブラウザは、 WEBブラウザから Localstackにログインして使える https://app.localstack.cloud/inst/default/resources
  14. ©Fusic Co., Ltd. 33 Localstack 無料版と有料版の違い LocalstackとcdklocalでつくるCDK開発環境入門 Localstackには、下記 2種類のdockerイメージがある。 •

    Localstack Community ◦ 無料版 • Localstack Pro ◦ 各種有料プランに対応 主な違いは、下記の 2点。 • エミュレートできる AWSサービスの違い • 作成したAWSリソースの永続化の違い
  15. ©Fusic Co., Ltd. 38 Localstack 無料版と有料版の違い LocalstackとcdklocalでつくるCDK開発環境入門 「作成した AWSリソースの 永続化の違い」とは

    ...? 無料版では、 作成したLocalstack上のAWS サービスは 基本的に永続化されない。 つまり、dockerをstopすると、 作成したAWSリソースは なくなってしまう services: localstack: container_name: localstack image: localstack/localstack:3.5 ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 - DEBUG=1 - PERSISTENCE=1 volumes: - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" https://docs.localstack.cloud/user-guide/state-management/persistence/
  16. ©Fusic Co., Ltd. 40 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 永続化できないのであれば、 docker起動後に

    毎回 cdk bootstrapから始めることになってしまい、シンドイ ... https://docs.localstack.cloud/references/init-hooks/
  17. ©Fusic Co., Ltd. 41 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 永続化できないのであれば、 docker起動後に

    毎回 cdk bootstrapから始めることになってしまい、シンドイ ... localstack起動時に、 cdkを流せば解決できるのでは? => Localstackのライフサイクルフック を活用 Localstackの起動時・開始時・シャットダウン時等に、任意のシェルス クリプト・ Pythonファイルを実行することができる https://docs.localstack.cloud/references/init-hooks/
  18. ©Fusic Co., Ltd. 43 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 なぜ永続化不可に抗うのか? =>

    有料版の社内稟議を通すまでに時間があったので ... 変に永続化に抗うよりも、永続化するのが楽なので、 普通に有料版を使った方 がいいです。
  19. ©Fusic Co., Ltd. 44 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 docker-compose.ymlを変更 •

    CDK準備のための、 Dockerfileを指定 • dockerのマウント部分を変更し、 localstack のライフサイクルフックのシェルを設定 • CDKのディレクトリもマウント する services: localstack: container_name: localstack - image: localstack/localstack:3.5 build: context: ./localstack dockerfile: ./Dockerfile ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 - PERSISTENCE=1 volumes: # boot・起動時に、boot.sh, init-aws.sh の実行を指定 # boot - "./localstack/hooks/boot.sh:/etc/localstack/init/boot.d/boot.sh" # ready - "./localstack/hooks/init-aws.sh:/etc/localstack/init/ready.d/init-aws.sh" # CDKのディレクトリをマウント - "./cdk:/opt/code/localstack/cdk" - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml
  20. ©Fusic Co., Ltd. 45 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 docker-compose.ymlを変更 •

    CDK準備のための、 Dockerfileを指定 • dockerのマウント部分を変更し、 localstack のライフサイクルフックのシェルを設定 ◦ /etc/localstack/init/boot.d/ ◦ /etc/localstack/init/ready.d/ • CDKのディレクトリもマウント する services: localstack: container_name: localstack - image: localstack/localstack:3.5 build: context: ./localstack dockerfile: ./Dockerfile ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 - PERSISTENCE=1 volumes: # boot・起動時に、boot.sh, init-aws.sh の実行を指定 # boot - "./localstack/hooks/boot.sh:/etc/localstack/init/boot.d/boot.sh" # ready - "./localstack/hooks/init-aws.sh:/etc/localstack/init/ready.d/init-aws.sh" # CDKのディレクトリをマウント - "./cdk:/opt/code/localstack/cdk" - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml
  21. ©Fusic Co., Ltd. 46 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 docker-compose.ymlを変更 •

    CDK準備のための、 Dockerfileを指定 • dockerのマウント部分を変更し、 localstack のライフサイクルフックのシェルを設定 • CDKのディレクトリもマウント する services: localstack: container_name: localstack - image: localstack/localstack:3.5 build: context: ./localstack dockerfile: ./Dockerfile ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 - PERSISTENCE=1 volumes: # boot・起動時に、boot.sh, init-aws.sh の実行を指定 # boot - "./localstack/hooks/boot.sh:/etc/localstack/init/boot.d/boot.sh" # ready - "./localstack/hooks/init-aws.sh:/etc/localstack/init/ready.d/init-aws.sh" # CDKのディレクトリをマウント - "./cdk:/opt/code/localstack/cdk" - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml
  22. ©Fusic Co., Ltd. 47 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 Dockerfileでは、 事前にcdkを入れておく

    FROM localstack/localstack:3.5 # localstack v3.5では、node18とpython3.11が入っている RUN npm install -g aws-cdk aws-cdk-local ENTRYPOINT ["docker-entrypoint.sh"] ./localstack/Dockerfile
  23. ©Fusic Co., Ltd. 48 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 #!/bin/sh echo

    "Running localstack boot script" # Python版 CDKのインストール cd /opt/code/localstack/cdk pip install -r requirements.txt ファイルがマウントされる boot 時に、 pip installでpython版CDKを 入れる ./localstack/hooks/boot.sh
  24. ©Fusic Co., Ltd. 49 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 #!/bin/sh export

    AWS_REGION=ap-northeast-1 echo "CDK settings..." cd /opt/code/localstack/cdk cdklocal bootstrap echo "CDK bootstrap done!!" cdklocal deploy echo "CDK deploy done!!" # awslocal を起動時に指定することも可能 awslocal sqs create-queue --queue-name test-queue 起動したら、 cdk bootstrapを実行後、デプロイ! これで起動時に cdk deployできる ./localstack/hooks/init-aws.sh
  25. ©Fusic Co., Ltd. 50 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 余談: 無料版で、

    PERSISTENCE=1 とした際に、 DynamoDBだけ永続 化するような謎の挙動をする (Localstack v3.5) volumeに保存される、DynamoDBのstateファイルらしきもの
  26. ©Fusic Co., Ltd. 51 永続化不可に抗う with CDK LocalstackとcdklocalでつくるCDK開発環境入門 余談に対する考察 :

    Localstack内部的には dynamodb-localが動い ているので、その影響かも ...?(わかりません ) localstack | 2024-06-16T14:38:32.515 DEBUG --- [et.reactor-1] plux.runtime.manager : loading plugin localstack.aws.provider:dynamodb:default localstack | 2024-06-16T14:38:32.545 DEBUG --- [et.reactor-1] localstack.packages.api : Installation of dynamodb-local skipped (already installed). localstack | 2024-06-16T14:38:32.545 DEBUG --- [et.reactor-1] l.services.dynamodb.server : Starting DynamoDB Local: ['java', '-Xmx256m', '-javaagent:/usr/lib/localstack/dynamodb-local/latest/ddb-local-loader-0.1.jar', '-Djava.library.path=/usr/lib/localstack/dynamodb-local/latest/DynamoDBLocal_lib', '-jar', '/usr/lib/localstack/dynamodb-local/latest/DynamoDBLocal.jar', '-port', '44195', '-dbPath', '/var/lib/localstack/state/dynamodb'] localstack | 2024-06-16T14:38:32.546 DEBUG --- [functhread10] localstack.utils.run : Executing command: ['java', '-Xmx256m', '-javaagent:/usr/lib/localstack/dynamodb-local/latest/ddb-local-loader-0.1.jar', '-Djava.library.path=/usr/lib/localstack/dynamodb-local/latest/DynamoDBLocal_lib', '-jar', '/usr/lib/localstack/dynamodb-local/latest/DynamoDBLocal.jar', '-port', '44195', '-dbPath', '/var/lib/localstack/state/dynamodb']
  27. ©Fusic Co., Ltd. 53 Localstackの環境変数の SERVICES LocalstackとcdklocalでつくるCDK開発環境入門 環境変数の SERVICESで、 Localstackで使用するサービスを限定することができる

    ※無理に指定する必要はない services: localstack: container_name: localstack image: localstack/localstack:3.5 ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 - PERSISTENCE=1 - DEBUG=1 - SERVICES=s3,sqs,sts,ssm,cloudformation,iam volumes: - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml
  28. ©Fusic Co., Ltd. 54 Localstackの環境変数の SERVICES LocalstackとcdklocalでつくるCDK開発環境入門 SERVICESを指定して cdklocalを使用する場合 は、

    エミュレートするサービス + sts,ssm,cloudformation,iamの指定が 必要なので、気を付けよう! services: localstack: container_name: localstack image: localstack/localstack:3.5 ports: - 4566:4566 - 4510-4559:4510-4559 environment: - AWS_DEFAULT_REGION=ap-northeast-1 - PERSISTENCE=1 - DEBUG=1 - SERVICES=s3,sqs,sts,ssm,cloudformation,iam volumes: - ./localstack/volume:/var/lib/localstack - "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml
  29. ©Fusic Co., Ltd. 57 Thank You We are Hiring! https://recruit.fusic.co.jp/

    ご清聴いただきありがとうございました