Slide 17
Slide 17 text
DockertestでLocalStackコンテナを起動するサンプル
func UpLocalStackWithDockerTest() (func(), string) {
pool, err := dockertest.NewPool("")
pool.MaxWait = 5 * time.Second
if err != nil {
log.Panicf("Could not connect to docker: %v", err)
}
err = pool.Client.Ping()
if err != nil {
log.Panicf("Could not connect to docker: %v", err)
}
runOptions := &dockertest.RunOptions{
Repository: "localstack/localstack",
Tag: "latest",
Name: "localstack-for-email-otp-test",
Env: []string{
"SERVICES=sns,sqs,dynamodb,lambda",
"DEFAULT_REGION=ap-northeast-1",
"DEBUG=1",
},
// ホストマシンのdocker daemonを使ってLambdaコンテナを立てるため
// ホストマシンのdocker daemonとソケット通信できるようにする
Mounts: []string{"/var/run/docker.sock:/var/run/docker.sock"},
}
resource, err := pool.RunWithOptions(runOptions,
func(config *docker.HostConfig) {
config.AutoRemove = true
config.RestartPolicy = docker.RestartPolicy{
Name: "no",
}
},
)
if err != nil {
log.Panicf("Could not start resource: %v", err)
}
// コンテナ側の4566ポートに対応するホスト側のホストとポートを取得
// ここで取得したホストとポートを使ってLocalStackのAPIにアクセスする
hostAndPort := resource.GetHostPort("4566/tcp")
healthcheckFunc := func() error {
resp, err := http.Get(fmt.Sprintf("http://%s/health", hostAndPort))
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("status code is not 200: %d", resp.StatusCode)
}
return nil
}
if err := pool.Retry(healthcheckFunc); err != nil {
pool.Purge(resource)
log.Panicf("Could not success healthcheck function: %v", err)
}
close := func() {
if err := pool.Purge(resource); err != nil {
log.Panicf("Could not purge resource: %v", err)
}
}
return close, hostAndPort
}