他のリソースへのアクセスを許可する
Amplify Function が他のリソースと連携するために、アクセス権を付与する必要があります。Amplify Function に他のリソースへのアクセスを許可する方法は 2 つあります。
access プロパティを使用する
access プロパティは、Amplify リソースを定義する各 define* 関数に見つかるプロパティです。一般的な言語を使用して必要なアクションを指定できます。
Data リソースから毎月レポートを生成し、生成されたレポートを Storage に保存する必要がある関数があるとします。
import { defineStorage } from '@aws-amplify/backend';import { generateMonthlyReports } from '../functions/generate-monthly-reports/resource';
export const storage = defineStorage({ name: 'myReports', access: (allow) => ({ 'reports/*': [ allow.resource(generateMonthlyReports).to(['read', 'write', 'delete']) ] })});このアクセス定義により、環境変数 myReports_BUCKET_NAME が関数に追加されます。この環境変数は env オブジェクトでアクセスできます。
以下は、これを使用して S3 にコンテンツをアップロードする方法の例です。
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';import { env } from '$amplify/env/generate-monthly-reports';
const s3Client = new S3Client();
export const handler = async () => { const command = new PutObjectCommand({ Bucket: env.MY_REPORTS_BUCKET_NAME, Key: `reports/${new Date().toISOString()}.csv`, Body: new Blob([''], { type: 'text/csv;charset=utf-8;' }) });
await s3Client.send(command);};CDK を使用する
access プロパティの機能では対応できない、リソースへのアクセスに関するアクセス許可が必要な場合は、CDK を使用する必要があります。
Function は実行ロール(Function が実行されるときにアクセスできるリソースを指定するポリシーを含む IAM ロール)を使用して作成されます。このロールは addToRolePolicy() メソッドを使用して拡張できます。
import { defineBackend } from "@aws-amplify/backend"import * as iam from "aws-cdk-lib/aws-iam"import * as sns from "aws-cdk-lib/aws-sns"import { weeklyDigest } from "./functions/weekly-digest/resource"
const backend = defineBackend({ weeklyDigest,})
const weeklyDigestLambda = backend.weeklyDigest.resources.lambda
const topicStack = backend.createStack("WeeklyDigest")const topic = new sns.Topic(topicStack, "Topic", { displayName: "digest",})
const statement = new iam.PolicyStatement({ sid: "AllowPublishToDigest", actions: ["sns:Publish"], resources: [topic.topicArn],})
weeklyDigestLambda.addToRolePolicy(statement)ただし、一部のコンストラクトは grant* メソッドを提供して、一般的なポリシーアクションへのアクセスを許可します。上記の例を再度確認すると、grantPublish を使用して同じアクセスを許可できます。
import { defineBackend } from "@aws-amplify/backend"import * as sns from "aws-cdk-lib/aws-sns"import { weeklyDigest } from "./functions/weekly-digest/resource"
const backend = defineBackend({ weeklyDigest,})
const weeklyDigestLambda = backend.weeklyDigest.resources.lambda
const topicStack = backend.createStack("WeeklyDigest")const topic = new sns.Topic(topicStack, "Topic", { displayName: "digest"})
topic.grantPublish(weeklyDigestLambda)