LoginSignup
5
1

More than 3 years have passed since last update.

localstackにLambdaのパッケージをディレクトリ指定でインストールしてzipに固めて作る(shell scriptバージョン)

Last updated at Posted at 2020-06-07

紹介する内容

  • localstackでlambdaを作ります
    • localstackのdocker-entrypoint-initaws.dを使う。主にshell scriptを使います
    • ユーザーが指定したディレクトリにpackageをインストールします
    • インストールしたpackageをzipに固めます

結論

  • lambdaのpackageのインストールを別のdockerコンテナにしたら、いろんな言語のpackageインストールに対応できます

    • localstackのコンテナにpythonのvenvなどのバージョン管理ツールをインストールして使う手もあります。ですが、言語ごとにツールの使い方を思えるより、dockerの使い方を覚えて全言語をカバーする方が効率的だと思いました
  • localstackのdocker-entrypoint-initaws.dでshell scriptでプロビジョニングは限界がある

    • 二つ以上のリソースが連携する形では戻り値のAWSのARNなどの扱いが大変です

紹介始めます

localstack紹介

実のAWSを使わずにいろいろ試せるものです。

バージョン0.11.0から大きな変化がありました。本記事は0.11.0バージョンのlocalstackを使います

https://github.com/localstack/localstack

ディレクトリ構成

全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/localstack/0.11.0/init-by-shell で確認できます

  • 全体図
    treeD.PNG

  • AWS SAMプロジェクトで生成した部分
    samInit.png

  • localstackのdocker-entrypoint-initaws.d機能を使うためにマウントした部分
    dockerAwsInit.png

localstack構築

docker composeを使います。

version: '3'

services:
  pip_installer:
    container_name: 'pip_installer'
    image: python:3.7-alpine3.10
    tty: true
    working_dir: /workspace/sam-lambda
    environment:
      LAMBDA_ZIP_PATH: /workspace/sam-lambda/hello_world/lambda.zip
    volumes:
      - ./sam-lambda:/workspace/sam-lambda

  localstack:
    container_name: 'localstack-dev'
    image: localstack/localstack:0.11.0
    ports:
      - '4566:4566'
    environment:
      SERVICES: lambda,logs,dynamodb
      DEBUG: 1
      HOSTNAME_EXTERNAL: localstack
      EDGE_PORT: 4566
      PORT_WEB_UI: 8080

      AWS_ACCESS_KEY_ID: AKIAIOSFODNN7EXAMPLE
      AWS_SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
      AWS_DEFAULT_REGION: us-east-1
      LAMBDA_ZIP_PATH: /workspace/sam-lambda/hello_world/lambda.zip
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./initaws:/docker-entrypoint-initaws.d
      - ./tmp/localstack:/tmp/localstack

      - ./sam-lambda:/workspace/sam-lambda
    depends_on:
      - pip_installer

docker-composeのvolumes(マウント)設定

  • localstackコンテナ

    • packageインストールやzipファイル共有するために、AWS SAMプロジェクトをマウントしておきます。
      • ./sam-lambdaは絶対パスqitta-example/localstack/0.11.0/init-by-shell/sam-lambdaと同じです
    • localstackのdocker-entrypoint-initaws.d機能を使うためにマウントして置きます
      • ./initawsは絶対パスqitta-example/localstack/0.11.0/init-by-shell/initawsと同じです
  • pip_installerコンテナ

    • packageインストールやzipファイル共有するために、AWS SAMプロジェクトをマウントしておきます。
      • ./sam-lambdaは絶対パスqitta-example/localstack/0.11.0/init-by-shell/sam-lambdaと同じです

docker-composeの環境変数設定

  • localstackコンテナ

    • SERVICESDEBUGHOSTNAME_EXTERNALEDGE_PORTPORT_WEB_UI はlocalstack固有の環境変数です。localstackを調べると理解できると思います
    • AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_DEFAULT_REGION はaws cliを便利に使うために設定しました
    • LAMBDA_ZIP_PATH はlambda生成に使うzipファイルの位置を書きました。コンテナ2つが連携して作業するから管理しやすくするために設定しました
  • pip_installerコンテナ

    • LAMBDA_ZIP_PATH はlambda生成に使うzipファイルの位置を書きました。コンテナ2つが連携して作業するから管理しやすくするために設定しました

docker-compose upによる作業の流れ

  1. pip_installerコンテナが作れる

    • localstackコンテナがdepends_onしているから、localstackコンテナより先に作られます
    • tty: trueオプションによって、作れた後もup状態を維持します
  2. localstackコンテナが作れる

    • コンテナが作れた後、localstack固有のもろもろ初期化作業が行われます
  3. docker-entrypoint-initaws.dディレクトリにあるshファイルを名前順で実行します

    • localstackの固有機能です。
    • もろもろ初期化作業が終わったら、マウントしている qitta-example/localstack/0.11.0/init-by-shell/initaws00_create_lambda_zip.sh01_lambda.sh順で実行してくれます
  4. 00_create_lambda_zip.sh

    • 待機していたpip_installerコンテナにdockerコマンドで入ります
    • pythonのpackageをディレクトリqitta-example/localstack/0.11.0/init-by-shell/sam-lambda/hello_world/packages に指定し、インストールします
    • pythonコード及びインストールしたpackageたちをzipで固めて$LAMBDA_ZIP_PATHに置きます
    • pip_installerコンテナを終了し、削除します
  5. 01_lambda.sh

    • aws cliを使って、lambdaを作ります。zipの位置は00_create_lambda_zip.shの作業で指定した$LAMBDA_ZIP_PATHにします
    • lambdaが作られます

localstackで作ったlambdaを試します

docker-compose up -d && docker attach localstack-dev します

cd qitta-example/localstack/0.11.0/init-by-shell
docker-compose up -d && docker attach localstack-dev

docker attach localstack-devしているあからlocalstackコンテナの作業が見れます
dockerComposeUp.png

pythonのpackageがpipによってインストールされてます

pipInstall.png

インストール終了後、zipで固めてます

makingZip.png

lambdaが生成されました

lambdaCreated.png

コンソールをもう一個開いて、localstackのlambdaにinvokeします

左側が docker attach localstack-dev している方、右側が docker exec -it localstack-dev /bin/bash してlambdaをinvokeする方です。
200返すことからちゃんと動いた確認が取れました。
invokeLambda.png

lambdaのコードはrequestsパッケージを使ってGET一回投げることをしています。
qitta-example/localstack/0.11.0/init-by-shell/sam-lambda/hello_world/app.py

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1