フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

AppRunnerをいろんな観点からチェックしてみたよ

f:id:lirlia:20210520015012p:plain

AWSの中の人から新しいサービスの紹介があり、

試してみようと思ったらクラメソが早速まとめていたのでやってみます!

dev.classmethod.jp

やりながら調べたことなど

AppRunner(アップランナー)

  • ソースコード
  • コンテナイメージ

のいずれかをAppRunnerに渡せば、コンテナのデプロイ、外部公開のためのロードバランサやNW、ドメイン、証明書の取得までをまるっとやってくれるサービスとのことです。

2021年5月時点ではVPCとの通信はできないとのことですが、必ずそのうちできるようになるでしょう。今後の開発スケジュールはこちら。

github.com

インフラエンジニアは本当に不要になってきていますね。まあLBやECSの整備をするだけのインフラエンジニアが必要なのか?ってところは疑問が持てますが

気になるところ

価格は?

コンテナインスタンスあたり$0.009 / GB-hour(東京)で、あとはCPUやメモリあたりの課金となります。加えてビルド時間や、通信料金なども発生するようです。

しかしLBがないのでその分コストカットできるのは大きいですね。

構成は?

App RunnerでデプロイしたインスタンスにHTTPアクセスをするとServerヘッダーにEnvoyがいるので、Envoy -> App Runnerになっているようです。Envoyが負荷分散やヘルスチェックを実現してるんですね。

またenvを叩くとAWS_EXECUTION_ENV=AWS_ECS_FARGATEと表示されるのでFargateで動作しているようです。またHOSTNAMEを見る限りどこかのVPCにいそうな名前ですね。

ECS_CONTAINER_METADATA_URI_V4=http://169.254.170.2/v4/xxxxx
HOSTNAME=ip-10-0-32-34.ap-northeast-1.compute.internal
AWS_DEFAULT_REGION=ap-northeast-1
PWD=/
HOME=/root
ECS_CONTAINER_METADATA_URI=http://169.254.170.2/v3/xxxxxx
AWS_EXECUTION_ENV=AWS_ECS_FARGATE
AWS_REGION=ap-northeast-1
PORT=80
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
OLDPWD=/opt

リソースはどんなもん?

  • CPU: 1 or 2 vCPU
  • Mem: 2 or 3 or 4 GB
  • ディスク: 64MB

叩くとこんな感じです。

df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs            64M     0   64M   0% /dev
shm             1.1G     0  1.1G   0% /dev/shm
tmpfs           1.1G     0  1.1G   0% /sys/fs/cgroup
/dev/vdd        3.4G  3.3M  3.2G   1% /etc/hosts
tmpfs           1.1G     0  1.1G   0% /sys/firmware
tmpfs           1.1G     0  1.1G   0% /proc/scsi

複数コンテナを動作させられるのか?

KubernetesにおけるPodやECSにおけるタスクのように1つのAppRunnerに複数のコンテナを動かせるのか?というのは気になるところです。(サイドカーとかアンバサダーの用途)

いまの時点ではできないようです。今後もできるようになるのかはわからないですねー。

どの程度のスケーラビリティなのか?

AutoScalingのポリシーを自分で設定できます。App Runnerで起動する1コンテナのことをインスタンスと呼ぶようなのですが、インスタンスごとに受け付けられる同時リクエスト数を規定しそれを超える場合にインスタンス数を自身で制御できます。

f:id:lirlia:20210519184541p:plain

どの程度の可用性なのか?

Fargateでは99.99%ですが、AppRunnerに関しては特に記載がありませんでした。ただEnvoyを除けばFargateで動いているので近い値になるのだと思います。

ログはどう管理されるのか?

  • AppRunnerへのデプロイログ
  • AppRunnerのイベントログ
  • コンテナのログ

が確認できました。また全てCloudWatchLogsに転送されています。驚きなのはGUI上でコンテナログも検索できるところですね。またログのダウンロードもできます。

メトリクスは?

  • リクエスト数
  • 200/4xx/5xxのレスポンス数
  • リクエストのレイテンシー
  • インスタンス数

環境変数の管理はどうするのか?

環境変数はAPIおよびcopilotでは管理できるものの、今現在web consoleでは最初に設定はできるが更新ができないようです。

インスタンスのバージョンアップはどうするのか?

手動と自動があります。

  • 手動:GUI / CLIでやる
  • 自動:Dockerレジストリを監視して、イメージプッシュごとにサービスの新しいバージョンをデプロイ

今の時点で使えるDockerレジストリはECRのみです。


実際にNginxを起動しているAppRunnerのイメージをapacheに差し替えてみたところ、最初は失敗し自動でロールバックをしました。その間の通信は特に失敗しなかったのですね。大体9分ぐらいです。

05-20-2021 01:36 AM [AppRunner] Service status is set to RUNNING.
05-20-2021 01:36 AM [AppRunner] Service update failed. For details, see service logs.
05-20-2021 01:27 AM [AppRunner] Service status is set to OPERATION_IN_PROGRESS.
05-20-2021 01:27 AM [AppRunner] Service update started.

その後、16:38:31に別のApacheイメージに差し替えたところ3分後に新しいイメージにさし変わりました。(全く違うイメージを使ってるので多少データ転送に時間がかかっている可能性あり)

Wed May 19 16:41:35 UTC 2021 <title>Welcome to nginx!</title>
Wed May 19 16:41:36 UTC 2021 <title>Welcome to nginx!</title>
Wed May 19 16:41:38 UTC 2021 <title>Welcome to nginx!</title>
Wed May 19 16:41:39 UTC 2021 <title>Apache2 Ubuntu Default Page: It works</title>
Wed May 19 16:41:40 UTC 2021 <title>Welcome to nginx!</title>
Wed May 19 16:41:41 UTC 2021 <title>Welcome to nginx!</title>
Wed May 19 16:41:42 UTC 2021 <title>Apache2 Ubuntu Default Page: It works</title>
Wed May 19 16:41:43 UTC 2021 <title>Apache2 Ubuntu Default Page: It works</title>
Wed May 19 16:41:44 UTC 2021 <title>Apache2 Ubuntu Default Page: It works</title>
Wed May 19 16:41:45 UTC 2021 <title>Apache2 Ubuntu Default Page: It works</title>
Wed May 19 16:41:46 UTC 2021 <title>Apache2 Ubuntu Default Page: It works</title>
Wed May 19 16:41:47 UTC 2021 <title>Apache2 Ubuntu Default Page: It works</title>

権限周り

  • IAMのインスタンスロールを付与できる
  • AWS KMSキーを使用できる

使い道

  • Web/Appに特化している(スケールの単位がリクエストなところとかからわかる)ので、その辺りを動かすときに使う
  • LBやドメインまで勝手に作るので、それ以外の用途でコンテナを動かしたい場合はECS/EKSが候補になる(GoogleのAppEngineにコンセプト近いなあ)