🖥️
[AWS] LocalStack でローカルにAWS開発環境を構築する
記事の内容を3行まとめ
- 「LocalStack」を使ってAWSの仮想環境をローカルに構築します
- SAMを使って「LocalStack」の環境に「SQS+Lambda」を構築します
- 構築環境の動作確認を行います
技術スタック
- Docker
- awscli
- LocalStack
- awscli-local
- SAM
- aws-sam-cli-local
環境準備
- Macを想定した手順となっています
Docker
- Mac上に仮想環境を構築するために利用
- 条件によっては有償となるので規約をよく確認する
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
- Dcoker上にAWSの仮想環境を構築するために利用
-
brew
コマンドを使ってサクッとインストール
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
- SQS および LambdaをLocalStackのAWS仮想環境へデプロイするために利用
-
brew
pip
どちらのインストール方法も非推奨?となったよう - 初めての方は手順のとおり、既にインストール済みの方はそのままで
SAM Local
- SAMでLocalStackに簡単にデプロイできるようにするツール
- 通常はSAMの向き先をLocalStackに向けることはできない
構築
Docker
- 任意の場所に
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を使って構築する
プロジェクト
- 任意の場所で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コンテナのログで起動確認を行う
- DockerDesktop を開く
-
localstack:main
コンテナを選択する -
Logs
タブを開く - 以下のようなログが出力されていれば起動確認OK
AWS sqs.SendMessage => 200 Running lambda: arn:aws:lambda:ap-northeast-1:000000000000:function:sam-app-HelloWorldFunction-46f0a849
まとめ
LocalStackを利用すると簡単にローカルでAWS実装環境が構築できました。
また、SAMとの連携もスムーズですぐにリソースの作成および実行までできます。
実際のAWS環境へのデプロイはまた少し手を加える必要がありますが、
ローカルでの開発がこれだけスムーズに構築できるのは非常にありがたいです。
LocalStackは無償版ですと利用可能サービスが限られてしまうため、
必要に応じて有償版の利用が推奨されます。
この記事がなにかの役に立てば幸いです。
Discussion