🐷

App Runnerをcdk deploy一発でデプロイする(ECR版)

2023/05/05に公開

概要

App Runnerがどんな感じかを知るために、
cdk deploy コマンドを1度実行するだけでデプロイできるようにしてみました。

App Runnnerには、マネージドランタイムというDocker(ECR)を使わなくてもデプロイできる方法と、ECRからデプロイする方法があるのですが(多分)、今回はECSとの比較するという観点も少しあるのでECRからデプロイする方法を採用しています。

※今回の記事ではECSとの比較はしません

CDKのコード

L2コンストラクタ

L2コンストラクタで実装しようとドキュメント(https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apprunner-readme.html)を見るとこんな感じに書いてありました。

→アルファ版を使ってみようと思います。

install aws-apprunner-alpha

npm i @aws-cdk/aws-apprunner-alpha

実装

ソースコードはこちらに置いてあります。
https://github.com/kodai305/sample-go-apprunner

ECRへのPUSH

    /**
     * ECR関連
     */
    // リポジトリの作成
    const repository = new ecr.Repository(this, "cdk-app-runner-sample-repo", {
      repositoryName: 'cdk-app-runner-sample-repo',
      removalPolicy: RemovalPolicy.DESTROY
    });

    // tag
    const tag = generateRandomString();
    
    // ビルド to CDKデフォルトリポジトリ
    const image = new DockerImageAsset(this, 'CDKAppRunnerSampleImage', {
      directory: '../app',
      platform: Platform.LINUX_AMD64, // App RunnerがARMが対応していないっぽい
    });
    // ビルドしたイメージをコピー
    new ecrdeploy.ECRDeployment(this, 'DeploySampleECRImage', {
      src: new ecrdeploy.DockerImageName(image.imageUri),
      dest: new ecrdeploy.DockerImageName(repository.repositoryUri + ':' + tag),
    });  

ecrdeployを使うことで指定のリポジトリへのコピーをすることができます。CI/CDパイプラインを作る際はタグをGitのコミットIDにしたりするのでCodeBuildやGitHubAcitionsでECRへのビルド/プッシュをすることが多いかと思いますが、簡易的にECRを使う場合はシェルなしでECRのPUSHまで行えるので気に入っています。

App Runner本体

最小限の実装です。

    new apprunner.Service(this, 'AppRunnerSampleService', {
      source: apprunner.Source.fromEcr({
        imageConfiguration: {
          port: 80, // Webサーバーのポート
        },
        repository,
        tag: tag,
      }),
    })

デプロイ

credencialsとREGION等をセットして、デプロイの実行をします。

cdk deploy

経過

イメージのpullに時間がかかる

App Runnerのマネージメントコンソールの画面で様子を見ていたら、300MBくらいのイメージのpullに6分くらい時間がかかっていました(pull開始のログからアプリケーションログが出るまでの時間の差が6分くらいだった)。これはECSとかのケースと比べると随分遅い感覚ですが、初回のService構築時だけはネットワーク関連のリソース作成とかで時間がかかるのかもしれません。2回目以降のデプロイではどうかは別途試してみたいですね。

→CreateServiceとUpdateServiceが遅いIssueも上がっているみたいです。
https://t.co/pEXkdW2x16

ARMのイメージはデプロイできなかった

ARMでECRへpushしていたらアプリケーションのエラーが発生しました。半年前くらいの記事ではARM対応していないとあったのでまだ未対応なのかもしれません。
→未対応でIssueが上がっている状態のようです。
https://t.co/YH6LgDIpeH

デプロイ成功

マネージメントコンソール:

画面:

参考

https://dev.classmethod.jp/articles/cdk-app-runner/
https://go-to-k.hatenablog.com/entry/ts-cdk-ts-managed-apprunner
https://constructs.dev/packages/@aws-cdk/aws-apprunner-alpha/v/2.78.0-alpha.0?lang=typescript

最後に

cdk deploy するだけでApp Runnerをデプロイすることができました。
負荷をかけてスケーリングを調査したり色々App Runnerについて調べたくなってきたので、良い足掛かりになった気がします。

誰かの参考になれば幸いです。

Discussion