如何将IAM权限添加到Cloudfront以供Lambda@Edge继承?

问题描述 投票:0回答:1

我正在使用 CDK 创建 Cloudfront 发行版和 Lambda@Edge 函数来控制对其的访问。

问题是,该函数需要权限才能从机密管理器读取机密。据我了解,该函数继承了其分发的服务角色,这对我来说很有意义。

但我不明白的是如何从发行版中获取服务角色以授予它。显然正确的做法是:

Secret.grantRead(distribution.grantPrincipal)

显然是正确的,只是类型

CloudFrontWebDistribution
没有
grantPrincipal

amazon-cloudfront aws-cdk aws-lambda-edge
1个回答
0
投票

我不确定以下陈述是否正确。你有什么参考资料可以证明这个说法吗?

我的理解是,该函数继承了其分发的服务角色,这对我来说是有意义的。

现在,谈论解决方案,您只需执行以下操作:

  1. 创建 IAM 角色
  2. 提供 IAM 角色权限以从 Secrets Manager 访问密钥
  3. 将 IAM 角色附加到 Lambda 函数

这是我用 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
});
© www.soinside.com 2019 - 2024. All rights reserved.