aws ecs & Fargateでhelloを表示する

はじめに

ECSの勉強したいけど何したらいいのかわからないという方は多いと思います

僕自身も絶賛勉強中なので備忘録としてECSの設定手順をまとめます

対象者

  • ECS何もわからんけど興味あるひと
  • お金に多少の余裕があるひと

<注> fargateは時間に対して料金がかかる

料金 - AWS Fargate | AWS

前提条件

  • dockerのコマンドがわかる
  • AWSアカウントを持っている

1, コンテナイメージを用意しよう

今回はgolangのイメージを用意します

使用するファイル

multistage-buildを使ってイメージサイズを落とした方が良いですが、ここでは割愛します

Dockerfile

FROM golang:alpine

COPY main.go /go/src
WORKDIR /go/src
CMD [ "go", "run", "main.go" ]

main.go

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "hello")
    })

    srv := &http.Server{
        Handler:           mux,
        Addr:              ":8000",
        ReadHeaderTimeout: 15 * time.Second,
        WriteTimeout:      15 * time.Second,
    }

    log.Fatal(srv.ListenAndServe())
}

イメージのビルド

docker build -t test-server .

ローカル環境でコンテナを実行する

docker run -it --rm -p 8000:8000 test-server

ターミナルでcurlをすると"hello"が出ると思います

$ curl http://localhost:8000/hello
hello

2, ECR (Elastic Container Registry)にイメージをpushする

リポジトリを作成を押す f:id:kntks:20210321202710p:plain

今回は test-repositoryという名前のリポジトリを作成します
それ以外はデフォルトでOK
f:id:kntks:20210321202850p:plain

リポジトリ作成後 プッシュコマンドの表示をクリック

f:id:kntks:20210321202938p:plain

プッシュコマンドが表示されるので、これを自分のターミナルに入力します

f:id:kntks:20210321204602p:plain

# Dockerクライアント認証
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded

# docker imageの作成
$ docker build -t test-repository .
[+] Building 0.4s (8/8) FINISHED
 => [internal] load build definition from Dockerfile
~~~

# イメージにタグをつける
docker tag test-repository:latest xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:latest

# イメージのプッシュ
$ docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:latest

再度 リポジトリのコンソールを見るとイメージがアップされているのが確認できると思います

f:id:kntks:20210321205543p:plain

3, ECSでクラスターを作成しよう

クラスターの作成をクリック f:id:kntks:20210321220137p:plain

ネットワーキングのみを選択

f:id:kntks:20210321220330p:plain

クラスター名は任意でいれる、今回は新規にVPCを作成

f:id:kntks:20210321220510p:plain

これでクラスターの作成は完了

f:id:kntks:20210321223327p:plain

4, タスクを定義しよう

新しいタスク定義の作成

f:id:kntks:20210321225014p:plain

起動タイプの互換性の選択ではFargateを選択します

f:id:kntks:20210321225102p:plain

f:id:kntks:20210321234830p:plainf:id:kntks:20210321234830p:plain

4, タスクを実行しよう

f:id:kntks:20210322003617p:plain

f:id:kntks:20210322003725p:plain

タスクが完了したらパブリックIPを確認しましょう

(訳あってタスク定義を作り直し直したので、名前が少し変わりました)

f:id:kntks:20210322011142p:plain

セキュリティグループのポート開け忘れに注意
しかし、後から変更できるので設定ミスしても問題はありません

 $ curl http://<ipアドレス>:8000/hello
hello