我正在使用 CDK 创建 Cloudfront 发行版和 Lambda@Edge 函数来控制对其的访问。
问题是,该函数需要权限才能从机密管理器读取机密。据我了解,该函数继承了其分发的服务角色,这对我来说很有意义。
但我不明白的是如何从发行版中获取服务角色以授予它。显然正确的做法是:
Secret.grantRead(distribution.grantPrincipal)
显然是正确的,只是类型
CloudFrontWebDistribution
没有 grantPrincipal
。
我不确定以下陈述是否正确。你有什么参考资料可以证明这个说法吗?
我的理解是,该函数继承了其分发的服务角色,这对我来说是有意义的。
现在,谈论解决方案,您只需执行以下操作:
这是我用 C# 编写的 CDK 代码片段,用于在 Lambda@Edge 上运行带有 SSR 的 Angular 应用程序。您只需根据需要更改 IAM 权限即可。
// 1.1 Create Lambda execution role
Role lambdaExecutionRole = new Role(this, "lambda-execution-role", new RoleProps
{
AssumedBy = new ServicePrincipal("lambda.amazonaws.com")
});
lambdaExecutionRole.AddManagedPolicy(ManagedPolicy.FromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole"));
// 1.2. Do not log into CloudWatch as logs might be costly
var policy = new Policy(this, "cw-deny-policy", new PolicyProps
{
Statements = new[] {
new PolicyStatement(new PolicyStatementProps {
Effect = Effect.DENY,
Actions = new [] { "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" },
Resources = new [] { "arn:aws:logs:*:*:*" }
})
}
});
lambdaExecutionRole.AttachInlinePolicy(policy);
// 2. Edge Function
var lambdaAtEdgeSSRFunction = new EdgeFunction(this, "ssr-lambda", new EdgeFunctionProps
{
MemorySize = 1024,
Timeout = Duration.Seconds(30),
Runtime = Runtime.NODEJS_18_X,
Handler = "lambda.handler",
Code = Code.FromAsset("./src/UtilityAppsCdk/DefaultArtifacts/SSREdgeLambda.zip"),
Role = lambdaExecutionRole
});