将应用程序拆分为多个环境后,我无法在应用程序中使用 SES。这是我的 AWS 结构: 我在一个 CDK 应用程序下有两个 AWS 账户。帐户 ROOT 是包含使用此类的 SES 资源定义的根帐户:
import * as cdk from 'aws-cdk-lib';
import * as ses from 'aws-cdk-lib/aws-ses';
import { Construct } from 'constructs';
import { ROOT_DOMAIN } from '../../iamphoto.constants';
export class SesStack extends cdk.Stack {
public constructor(scope: Construct, props: cdk.StackProps) {
super(scope, SesStack.name, props);
new ses.EmailIdentity(this, 'Identity', {
identity: ses.Identity.domain(ROOT_DOMAIN)
});
}
}
另一个帐户是帐户 DEV,它是一个托管开发环境的开发帐户,并且有一个名为“emailFunction”的 lambda 服务,其定义如下:
private getEmailsFunction(): lambdaNodeJs.NodejsFunction {
const nodejsFunction = new lambdaNodeJs.NodejsFunction(this, 'emailsFunction', {
functionName: 'emails-function',
entry: `${projectRoot}/index.ts`,
environment: {
SES_REGION: 'eu-central-1',
SES_EMAIL_FROM: this.envVariables.SES_EMAIL_FROM
},
runtime: lambda.Runtime.NODEJS_20_X,
});
nodejsFunction.role?.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSESFullAccess')
);
nodejsFunction.addPermission('InvokePermission', {
principal: new iam.ServicePrincipal('lambda.amazonaws.com'),
action: 'lambda:InvokeFunction'
});
new cdk.CfnOutput(this, 'EmailsFunctionArn', {
value: nodejsFunction.functionArn
});
return nodejsFunction;
}
问题是我的 lambda 函数无法使用 AmazonSESFullAccess,因为 SES 堆栈是在 ROOT 账户中实现的。毕竟ROOT账户可以访问域(在route53下注册)。
我会在 lambda 函数中使用假设角色来通过跨帐户发送电子邮件。您可以在根帐户中创建一个角色,该角色将有权访问 SES 并承担角色。
在您的开发帐户中,您可以承担该角色来发送电子邮件。希望这有帮助