はじめまして。ソフトウェアエンジニアのやぎーです。
コロナが再燃してますね。 在宅勤務を継続している方も多いのではないでしょうか。
最近、在宅時にローカル開発環境をもっと充実させたいなー、と感じることが増えてきたので 今回はAWSのローカルモック環境をご紹介したいと思います。
LocalStackとは
開発環境においてAWSのサービスを擬似的に使用できるモックフレームワークです。
特徴
手軽に環境が作れる
Dockerイメージを利用するか、pipでローカルへ直接インストールすることができます。 今回はDockerイメージを利用します。
複数のAWSサービス(モック環境)が利用できる
LocalStackを使うと、下記サービスがまとめて利用できるようになります。
- API Gateway
- Kinesis
- DynamoDB
- DynamoDB Streams
- S3
- Firehose
- Lambda
- SNS
- SQS
- Redshift
- Elasticsearch Service
- SES
- Route53
- CloudFormation
- CloudWatch
- SSM
- SecretsManager
- StepFunctions
- CloudWatch Logs
- EventBridge (CloudWatch Events)
- STS
- IAM
- EC2
- KMS
- ACM
料金など気にせずにテストや動作確認ができる
上記のサービスは基本的に無料で利用できます。 有料版でしか使えないサービスもあるのでGitHubを確認してみてください。
つくるもの
今回は簡素に。 サービス間でのやりとりができるのか検証をしたいと思ったので、 LambdaでS3にファイルを作成してみたいと思います。
設定
準備
基本モジュールは事前に導入しておいてください。
LocalStackインストール&起動
$ git clone https://github.com/localstack/localstack
$ cd localstack
指定がないとLambdaが別ネットワークで実行されるようなので、ネットワークを指定します。 docker-compose.yml->environmentに下記を追加
LAMBDA_DOCKER_NETWORK=host
起動
$ TMPDIR=/private$TMPDIR docker-compose up -d
起動確認
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 74c4493e092a localstack/localstack "docker-entrypoint.sh" 2 minutes ago Up 2 minutes 0.0.0.0:4566-4599->4566-4599/tcp, 0.0.0.0:8080->8080/tcp localstack_main
起動できました。はやい。お手軽。
AWS CLI設定
ダミーの設定で大丈夫です。
$ aws configure --profile=localstack AWS Access Key ID [None]: dummy AWS Secret Access Key [None]: dummy Default region name [None]: ap-northeast-1 Default output format [None]: json
S3バケット作成
## 作成 $ aws s3 mb s3://test-bucket --endpoint-url=http://localhost:4566 --profile=localstack make_bucket: test-bucket ## 確認 $ aws s3 ls --endpoint-url=http://localhost:4566 --profile=localstack 2020-07-28 13:37:57 test-bucket
こんな感じで表示されればOKです。
Lambda設定
テスト用のpyファイルを作成 S3にtest_日時.txtというファイルを作成するだけの処理。
$ vi lambda.py import boto3 from boto3.session import Session from datetime import datetime ## 検証なので固定値で設定 session = Session(aws_access_key_id='dummy', aws_secret_access_key='dummy', region_name='us-east-1' ) s3 = session.resource( service_name='s3', endpoint_url='http://localhost:4566' ) def lambda_handler(event, context): bucket = 'test-bucket' # バケット名を指定 key = 'test_' + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + '.txt' file_contents = 'Lambda Save File' s3.Bucket(bucket).put_object(Key=key, Body=file_contents) return 'create file'
zipファイルに圧縮
$ zip lambda.zip lambda.py
アップロード
$ aws lambda create-function --function-name="test-function" --runtime=python3.7 --role="arn:aws:iam::123456789012:role/service-role/lambda-test-role" --handler=lambda.lambda_handler --zip-file fileb://lambda.zip --endpoint-url=http://localhost:4566 --profile=localstack { "FunctionName": "test-function", "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:test-function", "Runtime": "python3.7", "Role": "arn:aws:iam::123456789012:role/service-role/lambda-test-role", "Handler": "lambda.lambda_handler", "CodeSize": 567, "Description": "", "Timeout": 3, "LastModified": "2020-07-28T13:37:23.672+0000", "CodeSha256": "GfPKv7jYspFribBiEInVUfLyR8W+K65LPOUID82vG3Y=", "Version": "$LATEST", "VpcConfig": {}, "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "44540e0e-ce6a-45db-a5c1-da6ac0ba776b", "State": "Active", "LastUpdateStatus": "Successful" }
動作確認
作成したLambda Functionを実行
AWS CLI バージョン2では、パラメータはbase64エンコードが前提のため、--cli-binary-format
を指定します。
Lambda起動
$ aws lambda invoke --cli-binary-format raw-in-base64-out --function-name test-function result.log --endpoint-url=http://localhost:4566 --profile=localstack { "StatusCode": 200, "LogResult": "", "ExecutedVersion": "$LATEST" }
FunctionError
が出力されていないことを確認しましょう。
S3ファイルを確認
$ aws s3 ls s3://test-bucket --endpoint-url=http://localhost:4566 --profile=localstack 2020-07-27 13:38:08 16 test_2020-07-26-13-38-08.txt
期待通りにファイルが作成されました!
さわってみた感想
使いやすい点
- Dockerイメージ簡単!
- 好きなサービスだけ指定して起動できる
- 完全に独立したAWS環境が使える
使いにくい点
おわりに
ほんの一部になりますが、LocalStackの使い方を紹介させていただきました。
在宅勤務などでクラウドサービスの需要が増加している中、 AWSの機能をローカルでも利用・検証できるのはとても素晴らしいことです。
また、これからAWSを使いたい方・AWSの勉強をしたい方の練習環境としても手軽に利用できます。
ローカル環境を充実させることで、在宅勤務でも開発のパフォーマンスを高めていきましょう!
\\『真のユーザーファーストでマーケットを創造する』仲間を募集中です!! //