Name:
interface
Value:
Amplify has re-imagined the way frontend developers build fullstack applications. Develop and deploy without the hassle.

Page updated Apr 30, 2024

Maintenance ModeYou are viewing Amplify Gen 1 documentation. Amplify Gen 1 has entered maintenance mode and will reach end of life on May 1, 2027. New project should use Amplify Gen 2. For existing Gen 1 projects, a migration guide and tooling are available to help you upgrade. Switch to the latest Gen 2 docs →

CDKを使用してカスタムAWSリソースを追加する

Amplify CLIは、AWS Cloud Development Kit (CDK)を使用してカスタムAWSリソースを追加する機能を提供します。Amplifyプロジェクトで amplify add custom コマンドを実行すると、CDKスタータースタックと他のAmplifyで生成されたリソースを参照するメカニズムが提供されます。

AWS Cloud Development Kit (AWS CDK)は、TypeScriptなどの使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースを定義するためのオープンソースソフトウェア開発フレームワークです。

amplify add custom
? How do you want to define this custom resource? … (Use arrow keys or type to filter)
❯ AWS CDK
AWS CloudFormation

スケルトンCDKスタックが amplify/backend/custom/<resource-name> ディレクトリに生成されます。cdk-stack.ts ファイルを編集して追加のAWSリソースを定義します。package.json を使用して追加のCDKコンストラクトを追加します。amplify build を実行してこのカスタムリソースのすべてのnpm依存関係をダウンロードしてCDKスタックを合成します。

AWS CDK v1からv2への移行については、移行ドキュメントを参照してください。

次の例は、通知メッセージがメール経由で転送されるSNSトピックを作成します。

import * as cdk from 'aws-cdk-lib';
import * as AmplifyHelpers from '@aws-amplify/cli-extensibility-helper';
import { Construct } from 'constructs';
import * as sns from 'aws-cdk-lib/aws-sns';
import * as subs from 'aws-cdk-lib/aws-sns-subscriptions';
export class cdkStack extends cdk.Stack {
constructor(scope: 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',
});
const amplifyProjectInfo = AmplifyHelpers.getProjectInfo();
const snsTopicResourceName = `sns-topic-${amplifyProjectInfo.projectName}-${cdk.Fn.ref('env')}`;
const topic = new sns.Topic(this, 'sns-topic', {
topicName: snsTopicResourceName,
});
topic.addSubscription(new subs.EmailSubscription('<your-email-address>'));
new cdk.CfnOutput(this, 'snsTopicArn', {
value: topic.topicArn,
description: 'The arn of the SNS topic',
});
}
}

注意: Amplifyのマルチ環境ワークフローで正しい動作を確保するために、常にリソース名にAmplify環境名を追加してください。

Amplify CLIを使用してカスタムリソースを作成する場合、CLIはAmplifyマネージドポリシー AdministratorAccess-Amplify の外に追加の権限が必要になる場合があります。 Amplify CLIに必要な権限に関する追加情報については、Amplify IAMポリシードキュメントを参照してください。また、Amplify CLI IAMユーザーに追加の権限を提供する方法の詳細については、AWS IAMユーザードキュメントを参照してください。

Amplifyプロジェクトと環境名を参照する

Amplifyはプロジェクト名や現在のAmplify環境名などのAmplifyプロジェクト情報を取得するヘルパー関数を提供します。

Amplifyプロジェクト名を参照する

AmplifyHelpers.getProjectInfo() 関数を使用してプロジェクト名を取得します。

import * as AmplifyHelpers from '@aws-amplify/cli-extensibility-helper';
// ...
const projectName = AmplifyHelpers.getProjectInfo().projectName;

Amplify環境名を参照する

環境にはさまざまなユースケース向けに2つのアクセスパターンがあります。各ユースケースに適したアクセスメカニズムを使用することは、マルチ環境ワークフローが正しく機能するために重要です。

リソースの変数として環境名を使用する場合は、cdk.Fn.ref('env') を使用します。

const role = new iam.Role(this, 'CustomRole', {
assumedBy: new iam.AccountRootPrincipal(),
roleName: `${roleResourceNamePrefix}-${cdk.Fn.ref('env')}` // Reference to Amplify "env" name
})

現在の環境名に基づいて条件付きロジックを適用する場合は、AmplifyHelpers.projectInfo() を使用します。

import * as AmplifyHelpers from '@aws-amplify/cli-extensibility-helper';
// ...
const envName = AmplifyHelpers.getProjectInfo().envName;
if (envName === "prod") {
// ...
} else {
// ...
}

Amplifyで生成されたリソースを参照する

カスタムAWSリソースのCDKスタックは、Amplifyで生成されたリソースのCloudFormation出力を参照できます。別のリソースを参照するには、最初にリソースを依存関係として追加します。

import { AmplifyDependentResourcesAttributes } from "../../types/amplify-dependent-resources-ref";
const dependencies: AmplifyDependentResourcesAttributes = AmplifyHelpers.addResourceDependency(this,
amplifyResourceProps.category,
amplifyResourceProps.resourceName,
[{
category: "function", // api, auth, storage, function, etc.
resourceName: "<resource-name>" // find the resource at "amplify/backend/<category>/<resourceName>"
} /* add more dependencies as needed */]
);

次に、cdk.Fn.ref 関数を使用して依存関係の出力の動的参照を作成します。

const myFunctionArn = cdk.Fn.ref(dependencies.function.<resource-name>.Arn)

dependencies 変数には自動生成された AmplifyDependentResourcesAttributes 型があり、すべてのAmplifyで生成されたリソース出力が含まれています。カテゴリー、リソース、またはパラメーターが見つからない場合は、amplify build を実行して AmplifyDependentResourcesAttributes を再生成します。