💡

LocalStack Community版をインストール後にセットアップする

2023/02/25に公開

前回の続きです。

設定

  1. リージョン、資格情報(鍵)の設定ファイル/フォルダを作る
  2. Dockerネットワークを作る
  3. コンテナ定義用の docker-compose.yaml ファイルを作り、LocalStackを起動する
  4. Lambda の関数一覧を表示する

1. リージョン、資格情報(鍵)の設定ファイル/フォルダを作る

aws configure --profile default

AWS Access Key ID [None]: test
AWS Secret Access Key [None]: test
Default region name [None]: ap-northeast-1
Default output format [None]:

出力

# Windows
C:\Users\<user-name>\.aws\config
C:\Users\<user-name>\.aws\credentials

# Linux, Mac
~/.aws/config
~/.aws/credentials
[default]
region = ap-northeast-1
[default]
aws_access_key_id = test
aws_secret_access_key = test

鍵をシェル変数として書きたい場合は以下のコマンドで実行する

# Windows
set AWS_ACCESS_KEY_ID=test
set AWS_SECRET_ACCESS_KEY=test

# Linux, Mac
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test

2. Dockerネットワークを作る

docker network create localstack

3. コンテナ定義用の docker-compose.yaml ファイルを作り、LocalStackを起動する

このファイルはどのディレクトリに置いてもOK

version: "3.8"
networks:
  default:
    external:
      name: "localstack"
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:
      - DEBUG=${DEBUG-}
      - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR-}
      - DOCKER_HOST=unix:///var/run/docker.sock
    volumes:
      - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"

LocalStackを起動します。前回のように localstack start -d で作ったコンテナが既に存在する場合は、そのコンテナは削除してから、下のコマンドを実行して下さい。

docker-compose up -d

4. Lambda の関数一覧を表示する

# Windows
docker run -v %USERPROFILE%\.aws:/root/.aws --network localstack --rm -it amazon/aws-cli --endpoint-url=http://localstack:4566 lambda list-functions

# Linux, Mac
docker run -v ~/.aws:/root/.aws --network localstack --rm -it amazon/aws-cli --endpoint-url=http://localstack:4566 lambda list-functions

出力

Unable to find image 'amazon/aws-cli:latest' locally
latest: Pulling from amazon/aws-cli
d78505e61525: Pull complete
9d96058e0712: Pull complete
f5c06ad21880: Pull complete
f026ffcf4f51: Pull complete
f3bfdd5c5d77: Pull complete
Digest: sha256:77606beb4000a4bc206744f1ed2666474c9c572dd6e39c97e3fa1a711190674c
Status: Downloaded newer image for amazon/aws-cli:latest

{
    "Functions": []
}

エラーについて

~/.aws ディレクトリを -v でマウントしてない場合

awscli をDocker上で実行しているため、ホストOS上のストレージに設定ファイルがあっても awscli がホストOS上のストレージにアクセス出来ません。
なので、Dockerコンテナ上でホストOS上の設定ファイルをアクセスできるようにマウントしておく必要があります。

You must specify a region. You can also configure your region by running "aws configure".

--region を設定しても認証情報のエラーが出ます

Unable to locate credentials. You can configure credentials by running "aws configure".

localstack start で実行している場合

Dockerコンテナ同士でネットワークの接続とホストOSでポートの接続が出来ていないので、 docker-compose.yaml でLocalStackを起動し直す必要があります。
↑解釈が変かもしれないので

Could not connect to the endpoint URL: "http://localstack:4566/2015-03-31/functions/"
An error occurred (InternalError) when calling the ListFunctions operation

region を存在しないリージョン名で実行している場合

LocalStackコンテナのログでエラーを見れます。
~/.aws/configregion = ここリージョンとゾーンにある値で書き換えましょう。

2023-02-25 22:56:22 localstack_main  | ValueError: 'local' is not a valid AWS region name for lambda

参考

Setting up local region and credentials to run LocalStack
AWS CLI v2 with Docker and LocalStack
localstack/docker-compose.yml
aws-cliとdockerを使う際、認証情報のマウントを飛ばしてしまった件

Discussion