この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部の夏目です。
先日、VSCodeのExtension Remote-Containers
を使ってGolangの開発環境をDocker上に作りました。(リンク)
個人的な話ですが、AWSで使用するCLIツールをGolangで書いています。
そのため、AWS環境のMockとしてLocalStackを使い、テストを書きたいと思いました。
Remote-Containers
ではdocker-composeを使って環境を作ることができるので、今回はLocalStackもGolangの開発用Containerと同時に立ち上げるようにしていきたいと思います。
環境構築
事前準備
Golangの環境は前回のブログで作ったものを流用したいと思います。
(compose_test
というディレクトリで作業をVSCodeで開いて作業します)
compose_test/
└── .devcontainer/
├── devcontainer.json
└── Dockerfile
Remote-Containersのdocker-compose 設定
.devcontainer/devcontainer.json
に次のように書き換えます。
{
"name": "Go",
"dockerComposeFile": [
"../docker-compose.yml",
"compose.yml"
],
"service": "compose_test",
"workspaceFolder": "/workspace/compose_test",
"shutdownAction": "stopCompose",
"extensions": [
"ms-vscode.go"
],
"settings": {
"go.gopath": "/go"
}
}
dockerFile
の項目を削除して、docker-composeの設定を追加します。
dockerComposeFile
でdocker-composeの定義を書いたyamlファイルで定義します。
docker-composeの定義は複数ファイルに分けて記載することができます。
なので、LocalStackの設定を書いた docker-compose.yml
と開発用のコンテナの設定を書いたcompose.yml
に分けます。
service
は開発用のコンテナを指定します。
わかりやすく言うと、前回のブログで作成した、Golangを動かすためのコンテナです。
shutdownAction
は終了時のコンテナに対する操作を定義しています。
今回はdocker-composeで動かしているので、docker-composeをストップさせるようにしています。
LocalStack用のdocker-compose.yml
version: "3.3"
services:
localstack:
container_name: localstack
image: localstack/localstack:0.8.10
ports:
- "4583:4583"
environment:
- SERVICES=ssm
- DEFAULT_REGION=ap-northeast-1
基本的(?)なLocalStackの設定です。
とりあえず、動作確認するためにSSMのみ有効化してますが、必要に応じて他のサービスを有効化してください。
Golangを動かすコンテナを定義するcompose.yml
version: '3.3'
services:
compose_test:
image: local/golang1
build:
context: .
dockerfile: .devcontainer/Dockerfile
volumes:
# Mounts the project folder to '/workspace'. The target path inside the container
# should match what your application expects. In this case, the compose file is
# in a sub-folder, so we will mount '..'. We'll then reference this as the
# workspaceFolder in '.devcontainer/devcontainer.json' so VS Code starts here.
- ../compose_test:/workspace/compose_test
# [Optional] If you are using SSH keys w/Git, mount your .ssh folder to
# /root/.ssh-localhost so we can copy its contents
- ~/.ssh:/root/.ssh:ro
# [Optional] Required for ptrace-based debuggers like C++, Go, and Rust
cap_add:
- SYS_PTRACE
security_opt:
- seccomp:unconfined
# Overrides default command so things don't shut down after the process ends.
command: /bin/sh -c "while sleep 1000; do :; done"
Remote-Containersのドキュメントに記載されていたサンプルをベースに作成しました。
build
オプションで、前回指定していた、Dockerfileを指定します。
(これで、前回使ったコンテナと同等のものを使用できます)
volumes
オプションで、ローカルのファイルをコンテナにマウントさせます。
また、~/.ssh
をマウントさせることでコンテナ内のbashで、Gitの操作をやりやすくしています。
準備完了
これでLocalStackを同時に立ち上げる準備は完了です。
ファイル構成は次のようになっています。
あとは Reopon Folder in Container
を行えばdocker-composeでコンテナが起動します。
compose_test/ ├── .devcontainer/ │ ├── compose.yml │ ├── devcontainer.json │ └── Dockerfile └── docker-compose.yml
動作確認
次のファイルを作成します。
package main
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ssm"
"fmt"
)
func main() {
sess := session.Must(session.NewSession(&aws.Config{
Credentials: credentials.NewStaticCredentials("foo", "var", ""),
Region: aws.String("ap-northeast-1"),
Endpoint: aws.String("http://localstack:4583"),
}))
service := ssm.New(sess)
putResult, _ := service.PutParameter(&ssm.PutParameterInput{
Name: aws.String("TestPath"),
Value: aws.String("test"),
Type: aws.String("String"),
})
fmt.Println(putResult)
describeResult, _ := service.DescribeParameters(&ssm.DescribeParametersInput{})
fmt.Println(describeResult)
}
SSM ParameterをPutして、一覧表示させるためのものです。
$ go mod init main
$ go run main.go
上記コマンドを実行すると、以下のようになります。
使用することができました。
これでLocalStackを使ったテストができます。
まとめ
コンテナを使った開発環境にLocalStackを追加して、AWSのテストができるようになりました。
Golang以外でも使用することできるので、使っていけたらなぁと思います。