AWS App RunnerでGolangのサーバーをサクッと立ててみる

# AWS App Runnerとは？
コンテナ化されたWebアプリを簡単にデプロイすることができるサービスです。(裏側ではFargateが使われているらしい)
２０２１年の５月に登場したサービスなので比較的新しいサービスっぽいです。

コンテナを動作させる手段としてはAmazon ECSがありますが、それよりもサクッとサーバーを立てたい時に重宝しそうです。

# 料金体系(@東京リージョン)
以下の３つの要素から構成されます。
1. プロビジョニングされるメモリ ・・・　0.009USD/GB
2. アクティブなコンテナインスタンスのCPUとメモリ・・・0.081 USD/vCPU + 0.009USD/GB
3. ビルド料金・・・0.005 USD/ビルド時間 (分)

1vCPU・メモリ２GB・ビルドなしで１ヶ月アクティブに運用すると、**約７０ドル**のコストがかかります。

# 2022年2月のアップデートでVPCのトラフィックがサポートに
リリースノートによるとApp RunnerがVPCのリソースにアクセス可能となったそうです。
https://docs.aws.amazon.com/apprunner/latest/relnotes/release-2022-02-08-vpc.html

どういうことかというと、これまで、App RunnerはRDS等のAWSリソースにアクセスする場合は、パブリックなアクセスが必要となっていたわけです。この点が気になっていてApp Runnerの使用に二の足を踏んでいたのですが、今回のアップデートをきっかけに一度試してみようと思いました。（しかし、今回の記事はパブリックアクセスするサーバーです。。。）

# 検証環境
Golangのechoフレームワークをつかってアプリをデプロイしてみようと思います。
Golangのバージョンは以下↓↓

```terminal
go version go1.17.8 darwin/amd64
```

GitHubリポジトリのURLは[こちら](https://github.com/Kohei-Sato-1221/apprunner-golang)です。


# ハンズオン

**(1) ECRのリポジトリ作成**
今回はECRにプッシュされたイメージを元にApp Runnerを動作させようと思います。
本記事では`appprunner-golang`という名称のリポジトリを作成しました。

![スクリーンショット 2022-03-06 9.05.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454171/de5bcc70-0812-b213-c7fe-f15c7fa82392.png)

※　あとで必要になるのでプッシュコマンドをコピーしておきます。



**(2) Golangアプリの実装準備**
```terminal
mkdir apprunner-golang && cd apprunner-golang
go mod init apprunner-golang
go get github.com/labstack/echo/v4
go get github.com/labstack/echo/v4/middleware
```

**(3) 実装**
```terminal
vim server.go
```

```go
package main

import (
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
	"net/http"
)

func main() {
	e := echo.New()
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	e.GET("/", helloAppRunner)

	e.Logger.Fatal(e.Start(":8080"))
}

func helloAppRunner(c echo.Context) error {
	return c.String(http.StatusOK, "Hello, This is AWS App Runner!!")
}
```


**(4) DockerFileの作成**
```dockerfile
FROM golang:1.17-alpine

WORKDIR /app
COPY go.mod ./
COPY *.go ./

RUN go mod tidy \
    && go get \
    && go build -o /apprunner-golang

EXPOSE 8080

CMD ["/apprunner-golang"]
```

**(5) ECRにイメージをプッシュ**
ECRのコンソールで取得しておいたプッシュコマンドを使います。

```terminal
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {your_account_id}.dkr.ecr.ap-northeast-1.amazonaws.com
docker build -t apprunner-golang .
docker tag apprunner-golang:latest {your_account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/apprunner-golang:latest
docker push {your_account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/apprunner-golang:latest

//M1　Macでビルドす場合は以下の通りにしないとだめっぽい
docker build --platform amd64 -t apprunner-golang .
```



**(6) App Runnerのコンソールで作業**
「コンテナレジストリ」・「Amazon ECR」を選択した上で、先程作成したECRのイメージのURIを指定します。
以下の通り設定して、「次へ」を押下。

![スクリーンショット 2022-03-06 9.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454171/6ab854c2-aaf6-09f8-a3f7-e93c672cec33.png)

次の画面ではサービス名を指定します。
また、ポートが`8080`になっているか、ネットワーキングが`パブリックアクセス`になっているかを確認します。

![スクリーンショット 2022-03-06 9.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454171/a93b202c-a305-d736-e6c6-fe063c61aa95.png)

「次へ」を押下します。その後の確認画面で「作成とデプロイ」を押下します。


**(7) 確認**
数分すると`Create Serviceが成功しました。`と表示されます。
![スクリーンショット 2022-03-06 10.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454171/1b6473f3-467b-9ab6-0c02-24ba52b1d3b4.png)


デフォルトドメインをクリックすると、Golangからのレスポンスが表示されるかと思います。

![スクリーンショット 2022-03-06 10.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454171/8b9bca00-b43c-ffac-716d-c233c2784a02.png)


 

# 所感
- コンテナ用意するだけで簡単にサービスが立ち上がるのでかなり便利。今後は、わざわざEC2上でdocker動かす必要はないかな、という気がする。
- ECSよりも大分手軽にサーバーを構築できる。学習コストもかなり低い。
- カスタムドメインもApp Runnerのコンソールから設定できるので、手軽に独自ドメインのWebサイト作れる。
- GitHubとも連携できるので、イメージをビルドする手間も省くことができそう。
- Auto Scalingも手軽に設定できそうな感じ。


# ソースコード
ソースコードは以下で取得できます。
https://github.com/Kohei-Sato-1221/apprunner-golang