はじめに
前回の記事では、ECR に Push したコンテナイメージを App Runner にデプロイする方法を紹介しました。
今回の記事では、ECR に新しいバージョンのコンテナイメージを Push することで、自動でバージョンアップ(Blue Green デプロイ)されることを確認します。
デプロイの詳細な流れは、下記の App Runner 入門動画に公開されています。
前提条件
App Runner の Service を構成するときに、Deployment settings を Automatic に設定していることが条件です。
バージョンアップ前
App Runner で稼働しているアプリケーションは、次の状態になっています。
コンテナをバージョンアップして ECR に Push
Go言語のプログラムを変更して、バージョンに関する文字列を付与します。
package main
import (
"database/sql"
"fmt"
"net"
"net/http"
"os"
"time"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func handler(w http.ResponseWriter, r *http.Request) {
// バージョンの表示
fmt.Fprintf(w, "バージョン2\n")
fmt.Fprintf(w, "\n")
// MySQL のデータを表示
row := db.QueryRow(`select * from sample`)
var id, name string
row.Scan(&id, &name)
println(name)
fmt.Fprintf(w, name+"\n")
fmt.Fprintf(w, "\n")
// ローカルのIPアドレスを表示
fmt.Fprintf(w, "IPアドレス一覧"+"\n")
interfaces, err := net.Interfaces()
if err != nil {
fmt.Println(err)
return
}
for _, inter := range interfaces {
addrs, err := inter.Addrs()
if err != nil {
fmt.Println(err)
return
}
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok {
if ipnet.IP.To4() != nil {
fmt.Println(ipnet.IP.String())
fmt.Fprintf(w, ipnet.IP.String()+"\n")
}
}
}
}
}
func main() {
// MySQL のコネクションを取得
mysql_hostname := os.Getenv("MYSQL_HOSTNAME")
mysql_port := os.Getenv("MYSQL_PORT")
mysql_username := os.Getenv("MYSQL_USERNAME")
mysql_password := os.Getenv("MYSQL_PASSWORD")
var err error
db, err = sql.Open("mysql", mysql_username+":"+mysql_password+"@tcp("+mysql_hostname+":"+mysql_port+")/sugi01")
if err != nil {
println("MySQL のコネクション接続に失敗")
panic(err)
}
defer db.Close()
db.SetConnMaxLifetime(time.Minute * 3)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)
http.HandleFunc("/", handler) // ハンドラを登録してウェブページを表示させる
http.ListenAndServe(":8080", nil)
}
アプリケーションを動かし、動作確認をします。
go run app.go
トップに「バージョン2」という文字を表示するようにしました。これで、どのバージョンが稼働しているかわかりやすいです。
go プログラムをビルドします。
go build -o app
Docker Image を Build します。
docker image build -t xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/app-runner-testapp:0.0.2 .
docker image build -t xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/app-runner-testapp:latest .
ECR に Push します
docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/app-runner-testapp:0.0.2
docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/app-runner-testapp:latest
ECR に Push されました
App Runner で自動更新
ECR に Push したことをトリガーに、新しいバージョンのデプロイプロセスが走ります。
この Operation 中でも、問題なく前のバージョンのアプリケーションにアクセスできます。この記事の環境だと、約2分ほど待つと Status が Running になりました。
App Runner の Service にアクセスしてみると、正常にバージョンアップがされています。
まとめ
App Runner の設定で自動デプロイを有効にすることで、ECR の更新をトリガーにした 自動 Blue Green デプロイメントを行うことが出来ました。CD パイプラインを自分たちで組む必要がないので、とても簡単で体験が良いですね。