LoginSignup
3
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-06

AWS App Runnerとは?

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

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

料金体系(@東京リージョン)

以下の3つの要素から構成されます。

  1. プロビジョニングされるメモリ ・・・ 0.009USD/GB
  2. アクティブなコンテナインスタンスのCPUとメモリ・・・0.081 USD/vCPU + 0.009USD/GB
  3. ビルド料金・・・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という名称のリポジトリを作成しました。

スクリーンショット 2022-03-06 9.05.27.png

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

(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を指定します。
以下の通り設定して、「次へ」を押下。

スクリーンショット 2022-03-06 9.19.40.png

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

スクリーンショット 2022-03-06 9.22.44.png

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

(7) 確認
数分するとCreate Serviceが成功しました。と表示されます。
スクリーンショット 2022-03-06 10.13.30.png

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

スクリーンショット 2022-03-06 10.14.17.png

所感

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

ソースコード

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

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3