🔍

AWS App Runner を AWS CDK で構築する

2022/12/02に公開

tl; dr

AWS App Runner の AWS CDK v2 モジュールは実験的な L2 Construct だが十分使えるぞ。

やっていく

作業環境

  • Ubuntu 22.04.1 LTS
  • Node.js 18.12.1 (LTS Hydrogen)

ドキュメントを眺める

まずは AWS App Runner 用の AWS CDK v2 モジュールのドキュメントを読みましょう。

aws-cdk-lib.aws_apprunner module · AWS CDK

There are no official hand-written (L2) constructs for this service yet.

なん…だと…。

大変残念ですが、このブログを書いている時点では AWS CDK v2 において AWS App Runner 用の公式 L2 Construct はありません。aws-cdk-lib.aws_apprunner は AWS CloudFormation のスキーマから自動生成された L1 Construct であり、実験的な L2 Construct として @aws-cdk/app-runner-alpha が用意されている状態となっています。

@aws-cdk/aws-apprunner-alpha module · AWS CDK

このブログでは実験的な L2 Construct を使った方法で AWS App Runner をデプロイしてみたいと思います。

実験的な L2 Construct (@aws-cdk/aws-apprunner-alpha) を使う

最初に実験的な L2 Construct を利用してみましょう。

まずは AWS CDK をインストールし、作業用ディレクトリ(~/apprunner-sample) で cdk init を実行しましょう。

❯ npm install -g aws-cdk

added 1 package, and audited 2 packages in 480ms

found 0 vulnerabilities

❯ npx cdk version
2.52.1 (build 7a2ef60)

❯ mkdir -p ~/apprunner-sample

❯ cd ~/apprunner-sample

❯ npx cdk init app --language=typescript
Applying project template app for typescript
# Welcome to your CDK TypeScript project

This is a blank project for CDK development with TypeScript.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

* `npm run build`   compile typescript to js
* `npm run watch`   watch for changes and compile
* `npm run test`    perform the jest unit tests
* `cdk deploy`      deploy this stack to your default AWS account/region
* `cdk diff`        compare deployed stack with current state
* `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
npm WARN deprecated w3c-hr-time@1.0.2: Use your platform's native performance.now() and performance.timeOrigin.
✅ All done!
❯

実験的な L2 Construct はこれだけでは利用できず、個別のインストールが必要です。実験的な L2 Construct に関する細かい説明は下記のブログ記事をご覧ください。

Experimental construct librariesがAWS CDK v2で利用可能になりました | Amazon Web Services ブログ

❯ npm install @aws-cdk/aws-apprunner-alpha

added 1 package, and audited 382 packages in 4s

29 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
❯

AWS CDK を使い慣れている方には釈迦に説法だと思いますが、cdk init をした時点で lib/apprunner-sample-stack.ts にスタックのサンプル実装が生成されます。これを @aws-cdk/aws-apprunner-alpha を使って書き換えていきましょう。ここでは、AWS Container Services DA Team がサンプル用に用意している aws-containers/hello-app-runner というコンテナイメージを使います。

lib/apprunner-sample-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as apprunner from '@aws-cdk/aws-apprunner-alpha';
import * as ecr from 'aws-cdk-lib/aws-ecr';

export class ApprunnerSampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const service = new apprunner.Service(this, 'Service', {
      source: apprunner.Source.fromEcrPublic({
        imageConfiguration: { port: 8000 },
        imageIdentifier: 'public.ecr.aws/aws-containers/hello-app-runner:latest',
      }),
    });

    new cdk.CfnOutput(this, 'ServiceUrl', {
      exportName: 'ServiceUrl',
      value: service.serviceUrl,
    });
  }
}

synth でエラーが出ないことを確認してから、デプロイを行います。

❯ npx cdk synth -q

❯ npx cdk deploy --profile <YOUR-AWS-PROFILE>

✨  Synthesis time: 3.66s

ApprunnerSampleStack: building assets...

[0%] start: Building 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef:current_account-current_region
[100%] success: Built 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef:current_account-current_region

ApprunnerSampleStack: assets built

ApprunnerSampleStack: deploying...
[0%] start: Publishing 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef:current_account-current_region
[100%] success: Published 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef:current_account-current_region
ApprunnerSampleStack: creating CloudFormation changeset...

 ✅  ApprunnerSampleStack

✨  Deployment time: 445.15s

Outputs:
ApprunnerSampleStack.ServiceUrl = fedcba0987.ap-northeast-1.awsapprunner.com
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/ApprunnerSampleStack/12345678-90ab-cdef-1234-567890abcdef

✨  Total time: 448.81s


❯

OutputsApprunnerSampleStack.ServiceUrlawsapprunner.com の URL が表示されているので、ここにアクセスします。下記のような画面が表示されたら成功です。

ティザーサイトのトップ画面

お片付け

❯ npx cdk destroy
Are you sure you want to delete: ApprunnerSampleStack (y/n)? y
ApprunnerSampleStack: destroying...

✅  ApprunnerSampleStack: destroyed
❯

実装状況

2月にリリースされた App Runner の VPC ネットワーキングモードはサポートされているようですが、11月にリリースされた AWS App Runner のプライベートサービスはまだ未実装のようです。

GitHub を確認すると AWS CDK 側でも、App Runner 側 でも実装済みという扱いとなっています。

AWS CDK の RFCに Construct ライブラリのライフサイクルが書かれていますが、まだ実験的な L2 Construct の Exit Criteria を満たせていないのかもしれません。

まとめ

最新の機能には追いついていないものの、AWS App Runner の実験的な L2 Construct は十分実用できるレベルかと思いました。

Discussion