AWS App Runner を AWS CDK で構築する
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 をデプロイしてみたいと思います。
@aws-cdk/aws-apprunner-alpha
) を使う
実験的な L2 Construct (最初に実験的な 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
というコンテナイメージを使います。
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
❯
Outputs
の ApprunnerSampleStack.ServiceUrl
に awsapprunner.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