Slide 1

Slide 1 text

Running App on AppRunner 2021-06-27 Drecom SRE Sunday slide:https://docs.google.com/presentation/d/1LpzbfhtwIhHo6t4lzhboy75L6Vj5LYpdlbPwvmmW5ek/edit?usp=sharing demo:https://github.com/ohr486/blog-sample-aws-app-runner

Slide 2

Slide 2 text

agenda ● About Me ● Target ● Goal ● AppRunnerとは ● AppRunnerのアーキテクチャ ● Set Up AppRunner ● Demo ● AppRunnerでできること ● AppRunnerでできないこと ● AppRunnerに足りないもの ● まとめ

Slide 3

Slide 3 text

About Me ● Tsunenori Ohara/おーはら ○ Twitter: @ohrdev ○ Github: ohr486 ● Work ○ Drecom, SRE部 manager ○ SRE/Infra/Ruby,Elixir,Lisp,etc ● Community ○ tokyo.ex, ElixirConfJapan, Erlang&ElixirFest ○ Japan Elixir Association ○ meguro.rb, meguro.es, etc ● Hobby ○ 仏像制作, 丸太収集, 写経, 寺社仏閣 ○ 人工衛星/アマチュア無線 ○ 自転車/ダイエット/脂肪燃焼

Slide 4

Slide 4 text

Target ● AWSでサービスを運用したい人 ● EC2ではなくコンテナでサービスを運用したい人 ● 簡単にサービスをセットアップしたい人 ● Kubernetesの学習に挫折した人 ● モチベーション ○ 運用サービス/システムが多すぎで管理がしんどい ○ アプリはコンテナで運用したい ○ ECS/EKSは便利だけどセットアップ・メンテする為に必要な知識が多すぎる ○ ぱっとセットアップできて、いい感じにマネージしてくれるマネージドサービスが出たぞ

Slide 5

Slide 5 text

Goal ● AppRunnerについて以下を理解する 1. AppRunnerの構成/アーキテクチャ 2. AppRunnerでできること・できないこと 3. AppRunnerで運用する際に気をつけること

Slide 6

Slide 6 text

AppRunnerとは ● AWSのコンピューティング系の新サービス ○ ソースコードのリポジトリ or コンテナイメージから Webアプリを簡単にデプロイ ○ ネットワーク・ロードバランサー・ TLS証明書等の関連リソースを一括でセットアップ ○ 同時リクエスト数に応じてオートスケールされる ○ 簡単に一時停止&再開可能 ○ サービスの実行分のみコスト請求される ● 今(2021/6)のところソースコードからデプロイする場合のランタイムはPython3、 nodejs12のみ対応 ○ これ以外のランタイムを利用したい場合は Dockerのコンテナレジストリからデプロイする必要があ る ● 実際に動かして確認したい人はWORKSHOPがおすすめ ○ https://www.apprunnerworkshop.com/

Slide 7

Slide 7 text

AppRunnerのアーキテクチャ user AppRunner ECR or initial & monitor code / image AppRunner Service deploy web console API AWS CLI AWS SDK operation AppRunnerサービスのVPC LoadBalancer TLS証明書 AutoScaling container container container ・・・ Custom Domain CloudWatch logs github connection

Slide 8

Slide 8 text

Set Up AppRunner ● GitHubのソースコードからdeployする場合 ○ WORKSHOP参照(今回のプレゼンでは割愛します ) ● コンテナイメージからdeployする場合 ○ アプリを作成 ○ ECRにリポジトリを作成 ○ AppRunnerサービスの作成 ○ Dockerイメージの作成 ○ ECRのリポジトリにイメージを push ○ (必要に応じて)カスタムドメインの登録

Slide 9

Slide 9 text

Demo ● AWSの事前準備 ○ ECRリポジトリ ○ RDS(Aurora/MySQL) ※ publicアクセス可能にしておく ○ IAMロール ● ソースコード ○ aws: https://github.com/ohr486/blog-sample-aws-app-runner/tree/master/aws ○ app: https://github.com/ohr486/blog-sample-aws-app-runner/tree/master/app ● アプリ仕様 ○ https://github.com/ohr486/blog-sample-aws-app-runner/blob/master/app/app/controllers/info_c ontroller.rb ○ /info/cpu => アプリが動作するサーバー /コンテナのCPU情報を出力 ■ cat /proc/cpuinfo ○ /info/mem => アプリが動作するサーバー /コンテナのメモリ情報を出力 ■ cat /proc/meminfo

Slide 10

Slide 10 text

App概要(1) container expose 8080 (HTTP) rails puma MySQL driver entrypoint.sh = DB Migration = = Railsの起動 = expose 3306 (MySQL)

Slide 11

Slide 11 text

App概要(1) ● Dockerfile ○ https://github.com/ohr486/blog-sample-aws-app-runner/blob/master/app/Dockerfile.apprunne1 ● entrypoint.sh ○ https://github.com/ohr486/blog-sample-aws-app-runner/blob/master/app/ep.apprunner1.sh ● puma.rb ○ https://github.com/ohr486/blog-sample-aws-app-runner/blob/master/app/config/puma1.rb

Slide 12

Slide 12 text

AppRunnerでできること ● 負荷分散(ロードバランシング) ● HTTPS通信(証明書発行) ● オートスケーリング ● 自動Deploy

Slide 13

Slide 13 text

AppRunnerでできないこと ● バッチ・タスクスケジューラー ○ RailsでいうところのSidekiqの様な非同期処理 ● FireWall (WAF) ● WebSocket通信 ● コンテナへ内のプロセスへのAttach/Exec(REPL) ● Webサーバー ○ nginx/apacheの様な大量のコネクションの処理機構 ● ログ転送(サイドカー) ● apprunner-roadmap ○ https://github.com/aws/apprunner-roadmap/issues

Slide 14

Slide 14 text

App概要(2) webサーバーを追加 container expose 8080 (HTTP) /app/tmp/sockets/puma.sock nginx listen 8080; upstream sock rails puma bind unix domain sock MySQL driver entrypoint.sh = DB Migration = = Railsの起動 = = nginxの起動 = expose 3306 (MySQL) proxy

Slide 15

Slide 15 text

App概要(3) ログコレクタを追加 container expose 8080 (HTTP) /app/tmp/sockets/puma.sock nginx listen 8080; upstream sock rails puma bind unix domain sock MySQL driver entrypoint.sh = fluentdの起動 = = DB Migration = = Railsの起動 = = nginxの起動 = expose 3306 (MySQL) logs fluentd expose 24224 (fluentd)

Slide 16

Slide 16 text

AppRunnerに足りないもの ● WebAppの運用上困るもの/こと ○ 選択できるCPU/Memoryのバリエーション(1vCPU/2vCPU, 2GB/3GB/4GB)が少ない ○ Dockerイメージ(Dockerfile)が複雑になる(ベストプラクティスから逸脱する ) ■ https://cloud.google.com/architecture/best-practices-for-building-containers?hl=ja ○ Dockerで複数のプロセスを起動するので何かしらのプロセス管理の機構が必要 ■ https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/multi-service_contai ner/ ○ Blue/Green Deploy・カナリアリリースの仕組み ■ AWSの既存サービス(Route53 etc)を組み合わせてがんばればなんとかなるけど、煩雑にな る ● セキュリティ上困るもの/こと ○ AppRunnerからPrivateなSubnetへのアクセスができない

Slide 17

Slide 17 text

App概要(4) ネットワーク AWSのネットワーク AppRunnerサービスのVPC LoadBalancer AutoScaling container 運用アカウントのネットワーク 運用サービスのVPC publicなsubnet privateなsubnet 通信できない 通信可能 RDS ElastiCache internet RDS ElastiCache Aurora Serverless 仕様上privateな subnetにDBを配 置できない DBはprivateな subnetに配置し たいができない

Slide 18

Slide 18 text

まとめ ● AppRunnerの概要について紹介しました ● ソース/Dockerイメージから簡単にWebAppに必要なリソース一式をdeployできる 事を開設しました ● ただし今(2021/6)時点では本番運用に足りない機能・仕組みが散見します ○ FireWall, ログ転送, バッチ, WebSocket, etc ○ Privateなネットワークへのアクセス ○ マシンspec(vCPU/Mem)のバリエーション ○ etc ● AWSの改善に期待しましょう