こんにちわ、まつしん(@matsushin11)です。
最近Goの学習を始め、その集大成としてAPIアプリを作ったまでは良いですがせっかくなので誰でもアクセスできるように環境を準備したい。
と思いGWではECSを色々触っていました。
結果サンプルアプリをecs-deployを用いてCircleCIからAmazon ECSに自動でデプロイするところまではできたのでその手順を備忘録も兼ねてまとめることにしました。
手順として量が多くなったので記事は3回に分けます。本記事はその最初の記事になります。
環境としてECSやecs-deployを選んだ理由としては仕事として関わっている案件で実際に利用されているからです。また開発言語としてはGoに限らなくても何でもDockerのイメージさえ作ることができればデプロイすることが可能です。
最終的に完成したリポジトリはこちらです。ecs-deployの利用にあたってはこちらの記事をとても参考にさせて頂きました。
Go学習自体のまとめは以下の記事になります。
第2回の記事はこちらです。
本記事の対象者
Amazon ECSを気になってはいるが使ったことがない。CIからのデプロイを試してみたい。という方になります。また多少GoやDockerの知識が必要になってきます。
本記事でやること
この記事単体ではサンプル用のGoアプリの実装とDocker化まで行います。
次の記事でECSを使ってアプリが動く環境を構築して、最後の記事でCIからECSにデプロイするための構築の手順を記載する予定です。
ECSとは
Amazon Elastic Container Serviceを略してECSと呼ばれています。
Amazon EC2インスタンスを用いてDocker環境としてクラスタ構成の構築ができます。またインフラ構築の実行や停止を簡単にしてくれる管理サービスになります。
ECSを使うと、GUIの操作だけでコンテナーの実行環境が素早く出来上がります。
動作環境
- Mac OS Mojave v10.14.4
- Go v1.11.2
- Docker v18.09.2
- Docker-compose v1.23.2
- AWS CLI v1.16.60
前提条件
- Goがインストールされている
- Dockerがインストールされている
- docker-composeがインストールされている
- AWS CLI がインストールされている
Goでサンプルアプリ実装
まずはとりあえず動くだけのアプリとしてmain.goを実装します。
前提としてはすでにGoが動く状態になっていることとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import ( "fmt" "net/http" ) func mainHandler(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "Hello, World!!\n") } func main() { http.HandleFunc("/", mainHandler) http.ListenAndServe(":8080", nil) } |
動作確認してみます。
1 |
$ go run main.go |
別タブにて下記のコマンドを実行して「Hello, World!!」と表示されればOK。
1 2 |
$ curl localhost:8080 Hello, World!! |
次にテストを実装しておきます。下記のようにmain_test.goを作成してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import ( "net/http" "net/http/httptest" "testing" ) func TestHomepage(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(mainHandler)) defer ts.Close() res, err := http.Get(ts.URL) if err != nil { t.Error("unexpected") return } if res.StatusCode != 200 { t.Error("Status code error") return } } |
テストを実行してみます。下記のようにokと表示されれば完了です。
1 2 3 |
$ go test PASS ok github.com/Matsushin/go-ecs-deploy 0.032s |
アプリのDocker化
次にECSではDocker環境を構築するためまずはローカル環境のDocker化をしていきます。
Dockerfileを作成して以下のようにしました。Dockerそこまで詳しくないので必要な箇所は適宜変更してもらえればと思います。おそらくそのままでも動きはするはずです。
1 2 3 4 5 6 7 8 9 10 11 12 |
FROM golang:1.11.2-alpine3.8 ENV GOPATH /go WORKDIR /go/src/github.com/Matsushin/go-ecs-deploy/ RUN apk update && apk upgrade && \ apk add --no-cache git COPY ./ /go/src/github.com/Matsushin/go-ecs-deploy/ EXPOSE 8080 CMD ["go", "run", "main.go"] |
次にdocker-compose.ymlを作成しましょう。
1 2 3 4 5 6 7 8 9 10 |
version: '3.4' services: app: build: context: ./ dockerfile: ./Dockerfile volumes: - ./:/go/src/github.com/Matsushin/go-ecs-deploy ports: - "8080:8080" |
2つファイルができたら動作確認していきます。
まずはDockerのイメージをビルド。
1 2 3 4 5 6 7 8 9 |
$ docker-compose build Building app Step 1/6 : FROM golang:1.11.2-alpine3.8 ---> 57915f96905a ... Successfully built 6e2803ffaca5 Successfully tagged go-ecs-deploy_app:latest |
「Successfully」と表示されればOK。次にコンテナの作成と開始を。
1 2 3 |
$ docker-compose up Recreating go-ecs-deploy_app_1 ... done Attaching to go-ecs-deploy_app_1 |
別タブにて下記のコマンドを実行して最初の実行同様に「Hello, World!!」と表示されればOK!!
1 2 |
$ curl localhost:8080 Hello, World!! |
この記事ではここまでです。次の記事ではECSを利用してアプリが動く環境を構築していきたいと思います!
コメントを残す