クイック エンジニアリングブログ

株式会社クイック Web事業企画開発本部のエンジニアリングチームが運営する技術ブログです。

LocalStackでAWSサービスを試してみた

はじめまして。ソフトウェアエンジニアのやぎーです。

コロナが再燃してますね。 在宅勤務を継続している方も多いのではないでしょうか。

最近、在宅時にローカル開発環境をもっと充実させたいなー、と感じることが増えてきたので 今回はAWSのローカルモック環境をご紹介したいと思います。

LocalStackとは

開発環境においてAWSのサービスを擬似的に使用できるモックフレームワークです。

github.com

特徴

手軽に環境が作れる

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にファイルを作成してみたいと思います。

設定

準備

基本モジュールは事前に導入しておいてください。

  • docker
  • docker-compose
  • git
  • aws-cli
  • zip

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環境が使える

使いにくい点

  • CLI操作が前提となるため、慣れていないと結構大変
  • 前提環境がある場合、構築用のスクリプトなどを用意する必要がある
  • ユースケースによっては機能が対応してなかったりする

おわりに

ほんの一部になりますが、LocalStackの使い方を紹介させていただきました。

在宅勤務などでクラウドサービスの需要が増加している中、 AWSの機能をローカルでも利用・検証できるのはとても素晴らしいことです。

また、これからAWSを使いたい方・AWSの勉強をしたい方の練習環境としても手軽に利用できます。

ローカル環境を充実させることで、在宅勤務でも開発のパフォーマンスを高めていきましょう!


\\『真のユーザーファーストでマーケットを創造する』仲間を募集中です!! //

919.jp