> [!warning] > このアクティビティは完了していない。 いくつかのフェーズに分けて対応する。 ## 前提 - [[LocalStack]]は[[Docker]]コンテナを使用する - [[Docker Compose]]を使う ## Localで動かす 目的は[[Bitbucket Pipelines]]での動作だが、Localで動作確認できた方が色々と便利なのでまずはローカルで。 前提として、以下はインストール済とする。 - [[Docker]] - [[Docker Compose]] - [[awscli-local]] - [[Go]] ### LocalStackの起動 `docker-compose.yml`を作成。 ```yaml 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" ``` > [Installation \| Docs](https://docs.localstack.cloud/getting-started/installation/#docker-compose) 起動する。 ```console $ docker compose up [+] Running 2/1 ✔ Network pipeline_localstack_default Created 0.1s ✔ Container localstack-main Created 0.1s Attaching to localstack-main localstack-main | localstack-main | LocalStack version: 2.3.3.dev localstack-main | LocalStack Docker container id: 1ec810e74ae4 localstack-main | LocalStack build date: 2023-11-09 localstack-main | LocalStack build git hash: 74c336ca localstack-main | localstack-main | 2024-02-02T03:16:19.873 INFO --- [-functhread4] hypercorn.error : Running on https://0.0.0.0:4566 (CTRL + C to quit) localstack-main | 2024-02-02T03:16:19.873 INFO --- [-functhread4] hypercorn.error : Running on https://0.0.0.0:4566 (CTRL + C to quit) localstack-main | Ready. ``` ### AWS Lambda 関数を作成する [[aws-lambda-go]]を使う。 ```console go mod init sample/localstack-aws-lambda-bitbucket-pipelines ``` `main.go` ```go package main import ( "github.com/aws/aws-lambda-go/lambda" ) func hello() (string, error) { return "Hello λ!", nil } func main() { lambda.Start(hello) } ``` ### 関数をビルドする まずは`go build`から。 ```console CGO_ENABLED=0 go build -o bootstrap main.go ``` `bootstrap`ができる。中身はバイナリだが実行ファイルとなる。続いてそれを[[ZIP]]圧縮する。 ```console zip lambda-handler.zip bootstrap ``` `lambda-handler.zip`ができる。これを[[LocalStack]]にデプロイして動作させる。 ### 関数をデプロイする > [Lambda \| Docs](https://docs.localstack.cloud/user-guide/aws/lambda/) ```console awslocal lambda create-function \ --function-name localstack-hello-go \ --runtime provided.al2 \ --zip-file fileb://lambda-handler.zip \ --handler main.handler \ --role arn:aws:iam::000000000000:role/lambda-role ``` [[Go]]のランタイムはちょっと分かりにくい。 > [Building Lambda functions with Go \- AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-golang.html) ### 関数を更新する 更新が必要な場合はコマンドが異なる。 ```console awslocal lambda update-function-code \ --function-name localstack-hello-go \ --zip-file fileb://lambda-handler.zip ``` ### 関数を実行する デプロイした関数を実行してみる。 ```console $ awslocal lambda invoke --function-name localstack-hello-go \ --cli-binary-format raw-in-base64-out \ output.txt { "StatusCode": 200, "ExecutedVersion": "$LATEST" } ``` > [Lambda \| Docs](https://docs.localstack.cloud/user-guide/aws/lambda/#invoke-the-function) レスポンスは`output.txt`に出力される。 ## Bitbucket Pipelinesで動かす ### Bitbucket PipelinesでLocalStackを起動する `bitbucket-pipelines.yml` ```yaml image: ubuntu:22.04 pipelines: default: - step: name: Localstack test size: 2x services: - docker script: - apt update -y - apt install -y curl - DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} - mkdir -p $DOCKER_CONFIG/cli-plugins - curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose - chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose - docker compose up -d ``` ### Bitbucket PipelinesでLocalStackのAWS Lambdaを実行する `bitbucket-pipelines.yml` ```yaml image: ubuntu:22.04 pipelines: default: - step: name: Localstack test size: 2x services: - docker script: - apt update -y - apt install -y curl zip git # ---------------------------------------- # 依存関係インストール # ---------------------------------------- - curl https://mise.jdx.dev/install.sh | sh - export PATH=$PATH:$HOME/.local/bin - export PATH=$PATH:$HOME/.local/share/mise/shims # Goのインストール - mise use --global [email protected] # Pipのインストール - apt install -y python3-pip # AWS CLIのインストール - mise use --global awscli # awscli-localのインストール - pip install awscli-local - aws configure set region ap-northeast-1 - aws configure set aws_access_key_id hoge - aws configure set aws_secret_access_key hoge # Docker composeインストール - DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} - mkdir -p "$DOCKER_CONFIG"/cli-plugins - curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o "$DOCKER_CONFIG"/cli-plugins/docker-compose - chmod +x "$DOCKER_CONFIG"/cli-plugins/docker-compose # ---------------------------------------- # AWS services # ---------------------------------------- # functionをビルド - CGO_ENABLED=0 go build -o bootstrap main.go - zip lambda-handler.zip bootstrap # Docker compose起動 - docker compose up -d # functionをデプロイ - |- awslocal lambda create-function \ --function-name localstack-hello-go \ --runtime provided.al2 \ --zip-file fileb://lambda-handler.zip \ --handler main.handler \ --role arn:aws:iam::000000000000:role/lambda-role # functionを実行 - sleep 5 # readyになるまで待つ - |- awslocal lambda invoke --function-name localstack-hello-go \ --cli-binary-format raw-in-base64-out \ output.txt - cat output.txt ``` 以下のエラーになる。 ```console + awslocal lambda invoke --function-name localstack-hello-go \ --cli-binary-format raw-in-base64-out \ output.txt localstack-main | 2024-02-02T06:31:08.713 DEBUG --- [ asgi_gw_0] rolo.gateway.wsgi : POST localhost:4566/2015-03-31/functions/localstack-hello-go/invocations localstack-main | 2024-02-02T06:31:08.714 ERROR --- [ asgi_gw_0] l.services.lambda_.hints : Failed to create the runtime executor for the function localstack-hello-go. Please ensure that Docker is available in the LocalStack container by adding the volume mount "/var/run/docker.sock:/var/run/docker.sock" to your LocalStack startup. Check out https://docs.localstack.cloud/user-guide/aws/lambda/#docker-not-available localstack-main | 2024-02-02T06:31:08.715 INFO --- [ asgi_gw_0] localstack.request.aws : AWS lambda.Invoke => 409 (ResourceConflictException) ``` 失敗直後に `docker ps -a` や `docker images` を実行しても **functionのコンテナは表示されない (dockerコマンドでデーモンにアクセスできないからその処理に達していない)** ことは分かった。 ### 試行錯誤 - [ ] `host.docker.internal`を使ってみる - [_] [[LocalStack]]のログにて `host.docker.internal:2375` にhttp clientがアクセスできずにエラーとなる - Ubuntuコンテナの `DOCKER_HOST`は `tcp://localhost:2375` - LocalStackコンテナの `DOCKER_HOST`が `host.docker.internal:2375` - [_] LocalStackコンテナの `DOCKER_HOST` を `tcp://localhost:2375` にしてみる - `Creating Docker SDK client failed: Error while fetching server API version: MyHTTPConnectionPool(host='localhost', port=2375): Max retries exceeded with url: /version (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f0f13e5dc90>: Failed to establish a new connection: [Errno 111] Connection refused'))` - どうして HTTPConnection なんですか? - そういう実装っぽいな... - [_] LocalStackコンテナの `DOCKER_HOST` を `tcp://host.docker.internal:2375` にしてみる - 同様にダメ (スキーマは結局切られる...) - [ ] BITBUCKET_DOCKER_HOST_INTERNAL is 何? - [ ] [[LocalStack]]を[[Docker]]でなく[[CLI]]として使ってみる ## 作成中: 図 ![[Diagram.svg]]