AWS App Runnerとは?
コンテナ化されたWebアプリを簡単にデプロイすることができるサービスです。(裏側ではFargateが使われているらしい)
2021年の5月に登場したサービスなので比較的新しいサービスっぽいです。
コンテナを動作させる手段としてはAmazon ECSがありますが、それよりもサクッとサーバーを立てたい時に重宝しそうです。
料金体系(@東京リージョン)
以下の3つの要素から構成されます。
- プロビジョニングされるメモリ ・・・ 0.009USD/GB
- アクティブなコンテナインスタンスのCPUとメモリ・・・0.081 USD/vCPU + 0.009USD/GB
- ビルド料金・・・0.005 USD/ビルド時間 (分)
1vCPU・メモリ2GB・ビルドなしで1ヶ月アクティブに運用すると、約70ドルのコストがかかります。
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のバージョンは以下↓↓
go version go1.17.8 darwin/amd64
GitHubリポジトリのURLはこちらです。
ハンズオン
(1) ECRのリポジトリ作成
今回はECRにプッシュされたイメージを元にApp Runnerを動作させようと思います。
本記事ではappprunner-golang
という名称のリポジトリを作成しました。
※ あとで必要になるのでプッシュコマンドをコピーしておきます。
(2) Golangアプリの実装準備
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) 実装
vim server.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の作成
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のコンソールで取得しておいたプッシュコマンドを使います。
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を指定します。
以下の通り設定して、「次へ」を押下。
次の画面ではサービス名を指定します。
また、ポートが8080
になっているか、ネットワーキングがパブリックアクセス
になっているかを確認します。
「次へ」を押下します。その後の確認画面で「作成とデプロイ」を押下します。
(7) 確認
数分するとCreate Serviceが成功しました。
と表示されます。
デフォルトドメインをクリックすると、Golangからのレスポンスが表示されるかと思います。
所感
- コンテナ用意するだけで簡単にサービスが立ち上がるのでかなり便利。今後は、わざわざEC2上でdocker動かす必要はないかな、という気がする。
- ECSよりも大分手軽にサーバーを構築できる。学習コストもかなり低い。
- カスタムドメインもApp Runnerのコンソールから設定できるので、手軽に独自ドメインのWebサイト作れる。
- GitHubとも連携できるので、イメージをビルドする手間も省くことができそう。
- Auto Scalingも手軽に設定できそうな感じ。
ソースコード
ソースコードは以下で取得できます。
https://github.com/Kohei-Sato-1221/apprunner-golang