🙆
Amplify override でバックエンドリソースをCDKでカスタマイズ
概要
- Amplifyの標準機能では設定できない項目をCDKを使って更新
AmplifyのCDK(Cloud Development Kit)はTypeScriptが標準?のようですがTypeScriptがわからない人でもたぶん大丈夫です。
実践的な例で3つ紹介します。
- Amplifyで生成されたstorage(S3)リソースにバージョニングをつける
- Amplifyで生成されたapi(DynamoDb)にTTLを設定する
- Amplify AuthでログインしたユーザーにAWSサービスの権限付与
この記事を書いたときのライブラリのバージョン
amplify cli 10.2.3
aws-amplify ^4.3.32
Amplifyで生成されたS3バケット構成をカスタマイズ
amplify add stroageが済んでいるものとして
amplify override storage
amplify/backend/storage/<リソース名>/override.tsが生成されます。
他にも
amplify/backendにtsconfig.jsonとpackage.jsonが追加されます。
amplify/backend/storage/<リソース名>/override.ts
import { AmplifyS3ResourceTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyS3ResourceTemplate) {
//バージョニングを有効にする以下3行を追加
resources.s3Bucket.versioningConfiguration = {
status: 'Enabled',
};
}
上記のように編集してpushします。
※AWS CDKやamplify customと異なり、build不要です。
リソース名を記載する欄もないのでコピペでいけます。
amplify push
StorageのところにUpdateのステータスが出ていることを確認して実行しましょう。
これだけでバージョニングが有効になります。
Amplifyで生成されたDynamoDB構成をカスタマイズ
type QueueTable @model @auth(rules: [{ allow: private, provider: userPools }]) {
key: ID! @primaryKey
queueUrl: String!
expired: Int!
}
上記のようなTableがあったとします。
expiredをTTL項目として設定するためにoverrideします。
amplify override api
先ほどの例と同じく、
amplify/backend/api/<リソース名>/override.tsが生成されます。
amplify/backend/api/<リソース名>/override.ts
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) {
//TTLを有効にする。以下4行をコピー
resources.models["QueueTable"].modelDDBTable.timeToLiveSpecification = {
attributeName: "expired",
enabled: true,
};
}
先ほどの例とは異なり、今度はTable名(models["<Table名>"])と項目名(attributeName)を指定する必要があるのでコピペNG!
amplify push
APIのところにUpdateのステータスが出ていることを確認して実行しましょう。
これだけでTTLが有効になります。
Amplify AuthでログインしたユーザーにAWSサービスの権限付与
amplify override project
※Authではないです。
amplify/backend/awscloudformation/override.tsが生成されます。
amplify/backend/awscloudformation/override.ts
import { AmplifyRootStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyRootStackTemplate) {
const authRole = resources.authRole;
const basePolicies = Array.isArray(authRole.policies)
? authRole.policies
: [authRole.policies];
authRole.policies = [
...basePolicies,
{
policyName: "amplify-permissions-custom-sqs",
policyDocument: {
Version: "2012-10-17",
Statement: [
{
Resource: `*`,
Action: ["sqs:SendMessage","sqs:SetQueueAttributes"],
Effect: "Allow",
},
],
},
},
];
}
こちらはやや複雑です。SQSのSendMessage権限を加えてます。
まとめ
手動によるうっかりを防ぐためにもoverrideを使いたいですね。
Discussion