🖥️

[AWS] LocalStack でローカルにAWS開発環境を構築する

2024/08/23に公開

記事の内容を3行まとめ

  • 「LocalStack」を使ってAWSの仮想環境をローカルに構築します
  • SAMを使って「LocalStack」の環境に「SQS+Lambda」を構築します
  • 構築環境の動作確認を行います

技術スタック

  • Docker
  • awscli
  • LocalStack
  • awscli-local
  • SAM
  • aws-sam-cli-local

環境準備

  • Macを想定した手順となっています

Docker

https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/

  • Mac上に仮想環境を構築するために利用
  • 条件によっては有償となるので規約をよく確認する

awscli

https://formulae.brew.sh/formula/awscli

  • brew コマンドを使ってサクッとインストール

aws configure

  • LocalStack用のプロファイルを作成しておく
aws configure --profile=local
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: ap-northeast-1
Default output format [None]: 

LocalStack

https://github.com/localstack/localstack

  • Dcoker上にAWSの仮想環境を構築するために利用
  • brew コマンドを使ってサクッとインストール

awscli-local

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

  • aws cli のコマンドの向き先をLocalStackに向けてくれるツール
    • これを使わないと常にエンドポイントの指定が必要となり煩わしい

※エンドポイント指定の例

# 通常
aws s3 ls --endpoint-url=http://localhost:4566 --region=ap-northeast-1

# awscli-local
awslocal s3 ls --region=ap-northeast-1

SAM CLI

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html

  • SQS および LambdaをLocalStackのAWS仮想環境へデプロイするために利用
  • brew pip どちらのインストール方法も非推奨?となったよう
  • 初めての方は手順のとおり、既にインストール済みの方はそのままで

SAM Local

https://github.com/localstack/aws-sam-cli-local

  • SAMでLocalStackに簡単にデプロイできるようにするツール
  • 通常はSAMの向き先をLocalStackに向けることはできない

構築

Docker

https://docs.localstack.cloud/getting-started/installation/#docker-compose

  • 任意の場所に docker-compose.yml を作成し以下をコピペ
version: "3.8"

services:
  localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-main}"
    image: localstack/localstack
    ports:
      - "127.0.0.1:4566:4566"            # LocalStack Gateway
      - "127.0.0.1:4510-4559:4510-4559"  # external services port range
    environment:
      # LocalStack configuration: https://docs.localstack.cloud/references/configuration/
      - DEBUG=${DEBUG:-0}
    volumes:
      - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"
  • Dockerコンテナ起動コマンドを打つ
docker-compose up -d --build
  • コンテナ起動してたらOK

SQSとLambda

  • SAMを使って構築する

プロジェクト

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/using-sam-cli-init.html

  • 任意の場所でSAMプロジェクトを作成する
sam init

You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.

Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
	1 - Hello World Example
	2 - Data processing
	3 - Hello World Example with Powertools for AWS Lambda
	4 - Multi-step workflow
	5 - Scheduled task
	6 - Standalone function
	7 - Serverless API
	8 - Infrastructure event management
	9 - Lambda Response Streaming
	10 - Serverless Connector Hello World Example
	11 - Multi-step workflow with Connectors
	12 - GraphQLApi Hello World Example
	13 - Full Stack
	14 - Lambda EFS example
	15 - DynamoDB Example
	16 - Machine Learning
Template: 1

Use the most popular runtime and package type? (Python and zip) [y/N]: y

Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: y
X-Ray will incur an additional cost. View https://aws.amazon.com/xray/pricing/ for more details

Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: N

Would you like to set Structured Logging in JSON format on your Lambda functions?  [y/N]: y
Structured Logging in JSON format might incur an additional cost. View https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-pricing for more details

Project name [sam-app]: sam-app

Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)

    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Runtime: python3.9
    Architectures: x86_64
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    Configuration file: sam-app/samconfig.toml

    Next steps can be found in the README file at sam-app/README.md


Commands you can use next
=========================
[*] Create pipeline: cd sam-app && sam pipeline init --bootstrap
[*] Validate SAM template: cd sam-app && sam validate
[*] Test Function in the Cloud: cd sam-app && sam sync --stack-name {stack-name} --watch


SAM CLI update available (1.123.0); (1.120.0 installed)
To download: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
  • sam-app というディレクトリが作成されていればOK

テンプレート

  • sam-app/template.yaml を編集してSQSとLambdaを構築するテンプレートを作成
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  Sample SAM Template for sam-app
Globals:
  Function:
    Timeout: 3
    MemorySize: 128
    Tracing: Active
    Runtime: python3.9
Resources:
  HelloWorldQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: hello-world-queue
      VisibilityTimeout: 30
      ReceiveMessageWaitTimeSeconds: 20
      MessageRetentionPeriod: 1209600 # 14 days
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Architectures:
      - x86_64
      Events:
        SqsEvent:
          Type: SQS
          Properties:
            Queue: !GetAtt HelloWorldQueue.Arn

デプロイ

  • LocalStackのAWS仮想環境へデプロイする
  • template.yaml がある場所で以下コマンドを打つ
# デプロイパッケージを作成する
samlocal build

# 同一ディレクトリに「.aws-sam」ができていればOK

# AWS仮想環境へデプロイする(確認フローをスキップするオプションを付与)
samlocal deploy --no-confirm-changeset

# 以下が出力されればOK
Successfully created/updated stack - sam-app in ap-northeast-1

リソース確認

  • Lmabda および SQS が作成されていることを確認
# Lambda
awslocal lambda list-functions --region=ap-northeast-1

# SQS
awslocal sqs list-queues --region=ap-northeast-1

無事AWS仮想環境にLambdaとSQSを作成することができました

動作確認

  • SQSにメッセージを送信しLambdaが起動するか確認します

SQSへメッセージ送信

  • AWS CLI を使ってSQSへメッセージ送信
# QueueのURLを取得
awslocal sqs list-queues --region=ap-northeast-1

# メッセージ送信
awslocal sqs send-message --queue-url {queue_url} --message-body '{"apple":"りんご"}' --region=ap-northeast-1

Lambda実行確認

  • LocalStackコンテナのログで起動確認を行う
  1. DockerDesktop を開く
  2. localstack:main コンテナを選択する
  3. Logs タブを開く
  4. 以下のようなログが出力されていれば起動確認OK
    AWS sqs.SendMessage => 200
    Running lambda: arn:aws:lambda:ap-northeast-1:000000000000:function:sam-app-HelloWorldFunction-46f0a849
    

まとめ

LocalStackを利用すると簡単にローカルでAWS実装環境が構築できました。
また、SAMとの連携もスムーズですぐにリソースの作成および実行までできます。

実際のAWS環境へのデプロイはまた少し手を加える必要がありますが、
ローカルでの開発がこれだけスムーズに構築できるのは非常にありがたいです。

LocalStackは無償版ですと利用可能サービスが限られてしまうため、
必要に応じて有償版の利用が推奨されます。

この記事がなにかの役に立てば幸いです。

株式会社THIRD エンジニアブログ

Discussion