> [!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]]