はじめに
先日からAWS CDKを使ってAWSリソースを作成してみることをしています。前回は以下の記事を参照。
今日はAppRunnerを作成してみます。
AppRunnerを作成する
今回はコンテナイメージをAppRunnerで動かすことにします。CDKのコードは以下の通り。
import * as apprunner from 'aws-cdk-lib/aws-apprunner'; import * as iam from 'aws-cdk-lib/aws-iam'; import * as ecr from 'aws-cdk-lib/aws-ecr'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { Construct } from "constructs"; interface AppRunnerProps { vpc: ec2.Vpc, repository: ecr.Repository, appRunnerSecurityGroup: ec2.SecurityGroup, } export class AppRunner extends Construct { constructor(scope: Construct, id: string, props: AppRunnerProps) { super(scope, id); const { vpc, repository, appRunnerSecurityGroup } = props; // Roleの作成(ECRに接続するため) const accessRole = new iam.Role(scope, 'AppRunnerAccessRole', { roleName: 'myapp-AppRunnerAccessRole', assumedBy: new iam.ServicePrincipal('build.apprunner.amazonaws.com'), }); accessRole.addManagedPolicy( iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSAppRunnerServicePolicyForECRAccess'), ); const service = new apprunner.CfnService(this, 'AppRunnerService', { sourceConfiguration: { authenticationConfiguration: { accessRoleArn: accessRole.roleArn, }, autoDeploymentsEnabled: true, imageRepository: { imageIdentifier: `${repository.repositoryUri}:latest`, imageRepositoryType: 'ECR', imageConfiguration: { port: '8080', }, }, }, }); } }
ECRからコンテナイメージが取得できずにハマったのですが、accessRole.addManagedPolicy
にてservice-role/AWSAppRunnerServicePolicyForECRAccess
ポリシーを付与してあげればOKでした。
上記をapp-runnner.ts
として保存し、stack側からは以下のように呼び出してあげたらOKでした。
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { Network } from './construct/network'; import { EcrRepository } from './construct/ecr-repository'; import { AppRunner } from './construct/app-runner'; export class CdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // VPCを作成する const { vpc, appRunnerSecurityGroup, cacheSecurityGroup } = new Network(this, 'Network'); // ECRを作成する const { repository } = new EcrRepository(this, 'Ecr'); // App Runnerを作成する new AppRunner(this, 'AppRunner', { vpc, repository, appRunnerSecurityGroup }); } }
cdk deploy
を実行すると無事CloudFormation上でデプロイが成功しました。
AppRunnerも想定通りに動いてくれました。
本当はElastiCacheと接続させたいのですが、どうもうまく動いてくれず...。もうちょっと調べてみます。