VSCodeとDockerで作ったGolangの開発環境にLocalStackを追加して、AWSのテスト環境を整える

こんにちは、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以外でも使用することできるので、使っていけたらなぁと思います。