Use CDK to add custom AWS resources - docs.amplify.aws
AWS CDK API Reference
Amplify x CDK でカスタムリソースを作る& CDK v2 に移行する
- Amplify で提供されてない AWS Resource を追加したい場合は
amplify add custom
から- CDK か CloudFormation の 2 択
- CloudFormation を手動で組むの人間のやることじゃないので CDK を頑張る
- AWS CDK (Cloud Development Kit) は TypeScript などを使って IaC するやつ
- 通常の CDK CLI で構成するより楽に Amplify プロジェクト CloudFormation に組み込めそう
- CDK CLI だと構成ファイル
cdk-stack.ts
書いてからcdk synth
で CloudFormation 用のテンプレート json にバラしてcdk deploy
で適用 ... という感じぽい- refs. CDK Serverless Aurora
- Amplify 統合だと
cdk-stack.ts
書くだけでよさそう
- CDK CLI だと構成ファイル
CDK 自体の概念や利用方法は ↓ あたりでさらっとくとよき。
- class Stack (construct) - docs.aws.amazon.com
- 【コードでインフラ定義】CDKという異次元体験をさくっとやるのに便利なAWS公式Workshopの紹介
- CloudFormationは、AWS CDKから使うのが正解な気がしてきた
- AWS CDK の3種類の Construct を使ってデプロイしてみた
AWS CDKまたはCloudFormationを使用し、カスタムAWSリソースでAmplifyバックエンドを拡張する新機能「カスタム」のご紹介
$ amplify add custom
? How do you want to define this custom resource? … (Use arrow keys or type to filter)
❯ AWS CDK
AWS CloudFormation
# ↑ ののち amplify/backend/custom/xxx/cdk-stack.ts を編集
# ts のビルド
$ npm run build
# CDK のビルド (多分だけど CloudFormation テンプレの生成かな?)
$ amplify build
# AWS リソースのデプロイ (amplify build を内部的に実行してから)
$ amplify push
公式ぱっと見た感じだと、プロジェクト名と環境名をリソース命名規則に入れる感じでいいみたい。
import * as cdk from '@aws-cdk/core'
import * as AmplifyHelpers from '@aws-amplify/cli-extensibility-helper'
// こいつら (SNS) をカスタムとして入れる
import * as sns from '@aws-cdk/aws-sns'
import * as subs from '@aws-cdk/aws-sns-subscriptions'
// クラス名とファイル名関係してるのかわからんが変更 NG だった
export class cdkStack extends cdk.Stack {
constructor(
scope: cdk.Construct,
id: string,
props?: cdk.StackProps,
amplifyResourceProps?: AmplifyHelpers.AmplifyResourceProps
) {
super(scope, id, props)
// こいつはうごかさない
/* Do not remove - Amplify CLI automatically injects the current deployment environment in this input parameter */
new cdk.CfnParameter(this, 'env', {
type: 'String',
description: 'Current Amplify CLI env name',
})
// Amplify のプロジェクト名、環境 (ENV) 名はこんな感じで取得
const project = AmplifyHelpers.getProjectInfo().projectName
const stage = cdk.Fn.ref('env')
const topic = new sns.Topic(this, 'sns-topic', {
topicName: `sns-topic-${project}-${stage}`
});
// SNS なので ↑ topic を受信したときに email 通知を送信するような感じ、多分
topic.addSubscription(new subs.EmailSubscription("my-email-address@example.com"))
}
}
Amplify で作成した AWS Resource (Lambda とか) を参照もできる。
const dependencies: AmplifyDependentResourcesAttributes = AmplifyHelpers.addResourceDependency(this,
amplifyResourceProps.category,
amplifyResourceProps.resourceName,
[
{
category: "function", // api, auth, storage, function, etc.
resourceName: "<resource-name>",
},
],
)
// 現在の ENV 環境に応じたリソースを参照するために ↓ cdk.Fn.ref() で取得するらしい
const myFunctionArn = cdk.Fn.ref(dependencies.function.<resource-name>.Arn)
- 普通の GUI ベースの構築 - Amazon Aurora Serverless の構築手順
- CDK ベースの構成例 - How to create an RDS Aurora serverless instance with CDK
- RDS パスワードの自動生成 & Secret Manager 登録 - AWS CDKでRDSのパスワードを自動生成してコード内で利用する
- Data API を使って VPC を介したアクセスをさせる - [アップデート] Aurora Serverless の Data API が東京リージョンでもサポートされました
- 現状 vpc は適当に作らんとあかんみたい - (aws-rds): vpc should be optional in ServerlessCluster #17401
cdk-patterns/serverless - serverless/the-rds-proxy/typescript/lib/the-rds-proxy-stack.ts