Amplify生成リソースの変更
Amplify GraphQL APIは、さまざまな自動生成された基礎となるAWSサービスとリソースを使用します。これらの基礎となるリソースをカスタマイズして、特定のユースケースに合わせてデプロイされたスタックを最適化できます。
amplify override api上記のコマンドを実行して、AWS AppSync API、Amazon DynamoDBテーブル、Amazon OpenSearchドメインなど、Amplify生成GraphQL APIリソースをオーバーライドします。
このコマンドは、amplify/backend/api/<resource-name>/の下に新しいoverrides.tsファイルを作成します。このファイルは、CDKコンストラクトとしてAmplify生成リソースを提供します。
CDKプロジェクトでは、すべての基礎となるリソースに"L2"または"L1"コンストラクトとしてアクセスできます。返されたスタックの.resourcesプロパティを経由してL2コンストラクトとして生成リソースにアクセスするか、.resources.cfnResourcesプロパティを使用してL1コンストラクトとして生成リソースにアクセスします。
const api = new AmplifyGraphQlApi(this, 'api', { <params> });
// Access L2 resources under `.resources`api.resources.tables["Todo"].tableArn;
// Access L1 resources under `.resources.cfnResources`api.resources.cfnResources.cfnGraphqlApi.xrayEnabled = true;Object.values(api.resources.cfnResources.cfnTables).forEach(table => { table.pointInTimeRecoverySpecification = { pointInTimeRecoveryEnabled: false };});Amplify生成AppSync GraphQL APIリソースのカスタマイズ
すべてのオーバーライドをoverride(...)関数に適用します。例えば、AppSync GraphQL APIのX-Rayトレーシングを有効にするには:
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.api.GraphQLAPI.xrayEnabled = true;}Amplifyが生成する以下のGraphQL APIリソースをオーバーライドできます:
| Amplify生成リソース | 説明 |
|---|---|
| GraphQLAPI | AWS AppSync GraphQL APIリソース |
| GraphQLAPIDefaultApiKey | AppSync GraphQL APIのAPIキーリソース |
| GraphQLAPITransformerSchema | デプロイされるGraphQLスキーマ。(GraphQL Transformerの出力) |
| GraphQLAPINONEDS | AppSync APIを終了しないリクエスト用の「none」データソース |
| AmplifyDataStore | Amplify DataStoreの競合解決に使用されるデルタ同期テーブル |
| AmplifyDataStoreIAMRole | DataStoreのデルタ同期テーブルにアクセスするために使用されるIAMロール |
| DynamoDBAccess | AppSyncからDynamoDBリソースにアクセスするためのIAMポリシー |
.resources.graphqlApiまたは.resources.cfnResources.cfnGraphqlApiにすべてのカスタマイズを適用します。例えば、AppSync GraphQL APIのX-Rayトレーシングを有効にするには:
const amplifyApi = new AmplifyGraphqlApi(this, 'MyNewApi', { definition: AmplifyGraphqlDefinition.fromFiles( path.join(__dirname, 'schema.graphql') ), authorizationModes: { defaultAuthorizationMode: 'API_KEY', apiKeyConfig: { expires: cdk.Duration.days(30) } }});
amplifyApi.resources.cfnResources.cfnGraphqlApi.xrayEnabled = true;@modelディレクティブのAmplify生成リソースのカスタマイズ
すべてのオーバーライドをoverride(...)関数に適用します。resources.models[...]に@modelタイプ名を渡して、その特定の@modelタイプ用に生成されるリソースを変更します。例えば、Todo@modelタイプのDynamoDBテーブルでtime-to-liveを有効にするには:
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.models['Todo'].modelDDBTable.timeToLiveSpecification = { attributeName: 'ttl', enabled: true };}Amplifyが生成する以下の@modelディレクティブリソースをオーバーライドできます:
| Amplify生成リソース | 説明 |
|---|---|
| modelStack | @modelタイプのすべてのリソースを含むネストされたスタック |
| modelDDBTable | このこの@modelタイプのデータを含むDynamoDBテーブル |
| modelIamRole | このこの@modelタイプのDynamoDBテーブルにアクセスするためのIAMロール |
| modelIamRoleDefaultPolicy | DataStoreが有効な場合、このこの@modelタイプのデルタ同期テーブルにアクセスするためのIAMポリシー |
| dynamoDBAccess | このこの@modelタイプのDynamoDBテーブルにアクセスするためのIAMロールに関連付けられたデフォルトポリシー |
| modelDatasource | DynamoDBテーブルを表すAppSyncデータソース |
| invokeLambdaFunction | Lambdaベースの競合解決関数のIAMポリシー |
例えば、モデル生成DynamoDBテーブル設定をオーバーライドできます。
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.models['Todo'].modelDatasource.dynamoDbConfig['deltaSyncConfig'][ 'baseTableTtl' ] = '3600';}.resources.tables["MODEL_NAME"]または.resources.cfnResources.cfnTables["MODEL_NAME"]にすべてのカスタマイズを適用します。.resources.cfnResources.cfnTables["MODEL_NAME"]に@modelタイプ名を渡して、その特定の@modelタイプ用に生成されるリソースを変更します。例えば、Todo@modelタイプのDynamoDBテーブルでtime-to-liveを有効にするには:
const amplifyApi = new AmplifyGraphqlApi(this, 'MyNewApi', { definition: AmplifyGraphqlDefinition.fromFiles( path.join(__dirname, 'schema.graphql') ), authorizationModes: { defaultAuthorizationMode: 'API_KEY', apiKeyConfig: { expires: cdk.Duration.days(30) } }});
amplifyApi.resources.cfnResources.cfnTables['Todo'].timeToLiveSpecification = { attributeName: 'ttl', enabled: true};例 - DynamoDBテーブルの課金モードを構成する
DynamoDB課金モードをDynamoDBテーブルに設定します。「PROVISIONED」または「PAY_PER_REQUEST」のいずれか。
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.models['Post'].modelDDBTable.billingMode = 'PAY_PER_REQUEST';}const amplifyApi = new AmplifyGraphqlApi(this, 'MyNewApi', { definition: AmplifyGraphqlDefinition.fromFiles( path.join(__dirname, 'schema.graphql') ), authorizationModes: { defaultAuthorizationMode: 'API_KEY', apiKeyConfig: { expires: cdk.Duration.days(30) } }});
amplifyApi.resources.cfnResources.cfnTables['Todo'].billingMode = 'PAY_PER_REQUEST';例 - DynamoDBテーブルまたはグローバルセカンダリインデックスのプロビジョニングされたスループットを構成する
デフォルトのProvisionedThroughputを各@modelテーブルおよびそのグローバルセカンダリインデックス(GSI)のためにオーバーライドします。
「DynamoDBBillingMode」が「PROVISIONED」に設定されている場合にのみ有効
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.models['Post'].modelDDBTable.provisionedThroughput = { readCapacityUnits: 5, writeCapacityUnits: 5 };
/** * 課金モードが「PROVISIONED」に設定されている場合、テーブルに存在するすべてのグローバルセカンダリインデックス(GSI)に対して`provisionedThroughput`を指定する必要があります。 */
resources.models[ 'Post' ].modelDDBTable.globalSecondaryIndexes[0].provisionedThroughput = { readCapacityUnits: 5, writeCapacityUnits: 5 };}例 - DynamoDBテーブルのポイントインタイムリカバリーを有効にする
各@modelテーブルのDynamoDBポイントインタイムリカバリーを有効/無効にします。
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.models['Post'].modelDDBTable.pointInTimeRecoverySpecification = { pointInTimeRecoveryEnabled: true };}const amplifyApi = new AmplifyGraphqlApi(this, 'MyNewApi', { definition: AmplifyGraphqlDefinition.fromFiles( path.join(__dirname, 'schema.graphql') ), authorizationModes: { defaultAuthorizationMode: 'API_KEY', apiKeyConfig: { expires: cdk.Duration.days(30) } }});
amplifyApi.resources.cfnResources.cfnTables[ 'Todo'].pointInTimeRecoverySpecification = { pointInTimeRecoveryEnabled: true};@searchable(OpenSearch)ディレクティブのAmplify生成リソースのカスタマイズ
override(...)関数にすべてのオーバーライドを適用します。例えば、OpenSearchインスタンス数を変更するには:
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.opensearch.OpenSearchDomain.elasticsearchClusterConfig = { ...resources.opensearch.OpenSearchDomain.elasticsearchClusterConfig, instanceCount: 6 };}Amplifyが生成する以下の@searchableディレクティブリソースをオーバーライドできます:
| Amplify生成リソース | 説明 |
|---|---|
| OpenSearchDataSource | OpenSearch統合を表すAppSyncデータソース |
| OpenSearchAccessIAMRole | OpenSearchドメインにアクセスするためのIAMロール |
| OpenSearchAccessIAMRoleDefaultPolicy | OpenSearchドメインにアクセスするためのIAMポリシー |
| OpenSearchDomain | @searchableデータを含むOpenSearchドメイン |
| OpenSearchStreamingLambdaIAMRole | DynamoDBデータをOpenSearchドメインにストリーミングするためのIAMロール |
| OpenSearchStreamingLambdaIAMRoleDefaultPolicy | DynamoDBデータをOpenSearchドメインにストリーミングするためのIAMポリシー |
| CloudwatchLogsAccess | CloudWatch Logsアクセスを付与するためのIAMポリシー |
| OpenSearchStreamingLambdaFunction | DynamoDBデータをOpenSearchドメインにストリーミングするためのLambda関数 |
| OpenSearchModelLambdaMapping | DynamoDBテーブルストリームからLambda関数へのイベントソースマッピング |
例 - ストリーミングLambdaのランタイムを構成する
関数オブジェクト自体にランタイム値を設定して、@searchableのランタイムを定義できます。これはAmplify CLIのバージョンをアップグレードできない場合に非推奨のランタイムを解決するために行うことができます。
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.opensearch.OpenSearchStreamingLambdaFunction.runtime = 'python3.9';}例 - OpenSearchストリーミング関数名を構成する
AWS Lambda検索可能ストリーミング関数の名前をオーバーライドします
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.opensearch.OpenSearchStreamingLambdaFunction.FunctionName = 'CustomFunctionName';}例 - OpenSearchインスタンスバージョンを構成する
@searchableで作成されたOpenSearchドメインのelasticsearchVersionをオーバーライドします
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.opensearch.OpenSearchDomain.elasticsearchVersion = 'OpenSearch_1.3';}例 - OpenSearchインスタンスタイプを構成する
@searchableで作成されたOpenSearchドメインにデプロイされるインスタンスのタイプをオーバーライドします
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.opensearch.OpenSearchDomain.elasticsearchClusterConfig = { ...resources.opensearch.OpenSearchDomain.elasticsearchClusterConfig, instanceType: 'm3.medium.elasticsearch' };}例 - OpenSearchインスタンス数を構成する
@searchableで作成されたOpenSearchドメインにデプロイされるインスタンスの数をオーバーライドします
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.opensearch.OpenSearchDomain.elasticsearchClusterConfig = { ...resources.opensearch.OpenSearchDomain.elasticsearchClusterConfig, instanceCount: 2 };}例 - OpenSearch EBSボリュームサイズを構成する
@searchableで作成されたOpenSearchドメイン内の各インスタンスに割り当てられるディスク容量をオーバーライドします
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.opensearch.OpenSearchDomain.ebsOptions = { ...resources.opensearch.OpenSearchDomain.ebsOptions, volumeSize: 10 };}@predictionsディレクティブのAmplify生成リソースのカスタマイズ
override(...)関数にすべてのオーバーライドを適用します。例えば、テキスト翻訳を容易にするIAMロールにパスを追加するには:
import { AmplifyApiGraphQlResourceStackTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyApiGraphQlResourceStackTemplate) { resources.predictions.TranslateDataSourceServiceRole.path = '/my/organization/';}Amplifyが生成する以下の@predictionsディレクティブリソースをオーバーライドできます:
| Amplify生成リソース | 説明 |
|---|---|
| RekognitionDataSource | Amazon Rekognitionサービスに接続するAppSync HTTPデータソース |
| RekognitionDataSourceServiceRole | Amazon Rekognitionに接続するためのAppSyncサービスロール |
| TranslateDataSource | Amazon Translateサービスに接続するAppSync HTTPデータソース |
| translateTextAccess | Amazon Translateに接続するためのIAMポリシー |
| LambdaDataSource | Amazon Pollyに接続するためのAppSync Lambdaデータソース |
| LambdaDataSourceServiceRole | Amazon Pollyを呼び出すLambda関数に接続するためのAppSyncサービスロール |
| LambdaDataSourceServiceRoleDefaultPolicy | Amazon Pollyを呼び出すLambda関数に接続するためのAppSyncのIAMポリシー |
| TranslateDataSourceServiceRole | Amazon Translateに接続するためのAppSyncサービスロール |
| predictionsLambdaIAMRole | Amazon Pollyを呼び出すLambda関数のIAMロール |
| predictionsLambdaFunction | Amazon Pollyを呼び出すLambda関数 |
| PredictionsLambdaAccess | Lambda関数がAmazon PollyにアクセスするためのIAMポリシー |
| predictionsIAMRole | @predictionsで使用されるS3バケットにアクセスするためのIAMロール |
| PredictionsStorageAccess | @predictionsで使用されるS3バケットにアクセスするためのIAMポリシー |
| identifyTextAccess | テキスト識別を有効にするためのIAMポリシー |
| identifyLabelsAccess | テキスト識別を有効にするためのIAMポリシー |
AppSyncリゾルバーをカスタム名スタックに配置する
GraphQLスキーマが特に大きい場合、スタックに定義されたリソースが多すぎることの問題が発生する可能性があります。このケースが最も一般的なのはConnectionStackで、これはスキーマ内のすべてのリレーショナルディレクティブのリゾルバーを含んでいます。
スタックマッピングを作成しても、Amplify環境用の追加のルートスタックは作成されません。すべてのマップされたスタックは、既存のAmplify環境ルートスタック下に配置されます。リゾルバーを別のスタックにマップするには、<プロジェクトルート>/amplify/api/<api名>/transform.conf.jsonを「StackMapping」ブロックで更新します。StackMappingはリゾルバーロジックIDからスタック名へのマップを定義します。
{ "Version": 5, "ElasticsearchWarning": true, "StackMapping": { "<Resolver logical ID>": "Custom stack name" }}リゾルバーロジックIDを決定する最も簡単な方法は、amplify api gql-compileを実行し、生成されたCloudFormationスタックのリソースのリストでリゾルバーロジックIDに注目することです。モデル操作のリゾルバーは<Get | List | Create | Update | Delete><モデル名>Resolverの形式になります。リレーショナルディレクティブのリゾルバーは<モデル名><フィールド名>Resolverの形式になります。
例
以下のスキーマが与えられた場合:
type Blog @model { id: ID! name: String! posts: [Post] @hasMany}
type Post @model { id: ID! title: String! content: String blog: Blog @belongsTo}CreatePostResolverおよびリレーショナルリゾルバーを「MyCustomStack」という名前のスタックにマップするには、transform.conf.jsonに以下を追加します:
"StackMapping": { "CreatePostResolver": "MyCustomStack", "BlogpostsResolver": "MyCustomStack", "PostblogResolver": "MyCustomStack",}