17 Jul 2021

AWS App Runner の軽い検証と雑感

AWS App Runner – Fully managed container application service - Amazon Web Services

機会があって、コンテナ化されている小さいアプリケーションをさっと動かしてデモするための環境を相談された。

そういえば最近 App Runner が出たよというニュース を見たのを思い出し、今回の用途に使えるかもしれないので、素振りがてら簡単に検証してみたメモ。

結構ブロッカーはあり、本番で使うのはまだ厳しそうな感触だった。ただ自分の考え方をシフトできていないだけかもしれない。

前提

  • コンテナ化された小さいアプリケーションがすでにある
    • データストアとして MySQL が必要
  • GitHub の特定のブランチに push すると GitHub Actions 経由で ECR に push するようにした
  • App Runner は ECR 上のリポジトリ特定のタグを監視していて更新があるとデプロイが走るようにした

気になったこと

App Runner から private な VPC 内にある RDS などのリソースに接続できない

例えば RDS の場合、今だと Public Access: Yes にしないとダメそう。これはけっこう致命的な気がするが…

  • App Runner を使いたいユーザーはある程度 AWS 上に既存の資産があると思われる
    • アプリケーション (ワークロード) をサーバレスに移したくて App Runner に乗せてみたが、既存の RDS に接続できなくてがっかり… ということは起こり得そう
  • そうでなければ (新規アプリで他に AWS 上で動いているリソースも無いのであれば) Heroku なりを使えばもっと楽なわけなので   要望の 1 番にあがってきているし upvote もたくさんついているので、まあみんなそう思ってるんだと思う。

Allow App Runner services to talk to AWS resources in a private Amazon VPC · Issue #1 · aws/apprunner-roadmap

今回は検証なのでとりあえず RDS に public access して凌いだ。

それとも、もしかしたら自分の考え方が古いのかもしれない。ゼロトラスト的に必要な認証さえできればどこからでも RDS にアクセスできたほうが良いのだろうか。

ECR のタグを immutable にできない

まず、そんなに自信なく間違っているかもしれないが、コンテナイメージのリポジトリのタグはイミュータブル(上書き不可)にした方が運用時の事故が減らせる気がしている。

実際 ECR には Tag Immutability という設定項目があり、上書き禁止にすることもできる。

一方で App Runner は一つの固定値でしか参照するリポジトリ、タグを指定できない。また指定したタグに更新があると自動でデプロイする機能はある。つまり Tag は mutable なものとして運用する思想になっているように見える。

まあ確かに latest タグだけは mutable にする、という運用は全然ありえる気はする。(ECR で特定のタグ以外は immutable という設定はできるのだろうか)

あるいは App Runner のサービスはデプロイごとに新しく作る思想なのかもしれない。自分はサービスを一つ作って更新していく方向で構築してしまった。

ちなみに今回は ECR リポジトリは tag mutable とし、latest タグが常に最新、それとは別に git のコミットハッシュを同じイメージに別タグとして打って履歴も残すことにした。こんな感じで GitHub Actions のワークフローを設定した。

    steps:
    - uses: actions/checkout@v1

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-1

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

    - name: Build, tag, and push image to Amazon ECR
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
      run: |
        IMAGE_TAG=$(git rev-parse --short HEAD)-$(date +%Y%m%d%H%M%S)  # コミットハッシュ込みのタグ。運用上は immutable
        LATEST_TAG=latest                                              # mutable な latest タグ
        docker build -t $ECR_REPOSITORY:$IMAGE_TAG -f path/to/Dockerfile .
        docker tag $ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:$LATEST_TAG
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$LATEST_TAG
        docker tag $ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

HTTP ヘルスチェックをコンソールから設定できない

TCP (指定したポートで接続を確立できるか)はコンソールから設定できるが、HTTP GET でのヘルスチェック設定がなぜかコンソールからできない。

機能としては存在して、aws cli からは設定できる。

create-service — AWS CLI 1.20.1 Command Reference

既存のアプリを載せる場合、HTTP のヘルスチェック用エンドポイントを持っていることも多いと思うので、コンソールからも設定できた方が便利な気はするが…

Support configuration of HTTP health checks from the console · Issue #63 · aws/apprunner-roadmap

PR