🙆

Amplify override でバックエンドリソースをCDKでカスタマイズ

2022/10/19に公開

概要

  • Amplifyの標準機能では設定できない項目をCDKを使って更新
    AmplifyのCDK(Cloud Development Kit)はTypeScriptが標準?のようですがTypeScriptがわからない人でもたぶん大丈夫です。
    実践的な例で3つ紹介します。
  1. Amplifyで生成されたstorage(S3)リソースにバージョニングをつける
  2. Amplifyで生成されたapi(DynamoDb)にTTLを設定する
  3. 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します。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/howitworks-ttl.html

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