使用 AWS CDK 为 lambda 指定自定义角色

Iva*_*zak 16 amazon-web-services node.js aws-lambda aws-cdk

我意识到它很新,但我没有看到任何语言的示例如何为使用 AWS CDK 创建的 lambda 指定角色。

我试图这样做

const cdk       = require('@aws-cdk/cdk');
const lambda    = require('@aws-cdk/aws-lambda');
const iam       = require('@aws-cdk/aws-iam');

const path      = require('path');

class MyStack extends cdk.Stack {
    constructor (parent, id, props) {
            super(parent, id, props);

            //
            // Create a lambda...
            const fn = new lambda.Function(this, 'MyFunction-cdktest', {
                runtime: lambda.Runtime.NodeJS810,
                handler: 'index.handler',
                code: lambda.Code.directory( path.join( __dirname, 'lambda')),
                role: iam.RoleName('lambda_basic_execution')
            });

    }
}

class MyApp extends cdk.App {
        constructor (argv) {
                super(argv);

                new MyStack(this, 'hello-cdk');
        }
}

console.log(new MyApp(process.argv).run());
Run Code Online (Sandbox Code Playgroud)

为了尝试为函数指定现有的 IAM 角色,但这似乎不是正确的语法。我也可以(甚至可能更喜欢)动态生成特定于该 lambda 的自定义角色,但我也没有看到任何有关如何执行此操作的示例。

有没有人对如何实现这一目标有任何见解?

rix*_*rrr 25

Lambda 已经带有执行角色,并且它已经具有基本的执行权限。如果要为其拥有的角色添加其他权限,请执行以下操作:

lambda.addToRolePolicy(new cdk.PolicyStatement()
   .addResource('arn:aws:....')
   .addAction('s3:GetThing'));
Run Code Online (Sandbox Code Playgroud)

或者更好的是,使用其中一种便利功能来获取某些资源的权限:

bucket.grantRead(lambda.role);
Run Code Online (Sandbox Code Playgroud)

  • 可能应该是 iam.PolicyStatement() 而不是 cdk.PolicyStatement() (8认同)
  • 您也可以只导入 PolicyStatement:`import { PolicyStatement } from '@aws-cdk/aws-iam';` (2认同)

小智 14

即使 lambda 带有 IAM 角色,您也可以为 lambda 创建自定义角色。您只需要确保为其分配正确的最低所需权限。

您可以创建这样的角色:

    const customRole = new Role(this, 'customRole', {
                    roleName: 'customRole',
                    assumedBy: new ServicePrincipal('lambda.amazonaws.com'),
                    managedPolicies: [
                        ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole"),
                        ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole")
                    ]
                })
Run Code Online (Sandbox Code Playgroud)

如果 lambda 不需要位于 VPC 中,您可以跳过 AWSLambdaVPCAccessExecutionRole。

并将此角色分配给 lambda 函数:

const lambda = new lambda.Function(this, 'lambda', {
                runtime:....,
                code:...,
                role: customRole,
                handler:....,
                memorySize:...,
                timeout:....,
                vpc:...,
                environment: {
                   ....
                }
            });
Run Code Online (Sandbox Code Playgroud)


Bil*_*ill 11

@rix0rrr 接受的答案不再有效。似乎 CDK 得到了一些更新。目前版本是

"@aws-cdk/core": "^1.1.0"
Run Code Online (Sandbox Code Playgroud)

更新代码:

    import iam = require("@aws-cdk/aws-iam");

    const statement = new iam.PolicyStatement();
    statement.addActions("lambda:InvokeFunction");
    statement.addResources("*");

    lambda.addToRolePolicy(statement); 
Run Code Online (Sandbox Code Playgroud)


Tan*_*vir 9

比尔的回答有效,但这是另一种方式:

import iam = require("@aws-cdk/aws-iam");

lambda.addToRolePolicy(new iam.PolicyStatement({
  effect: iam.Effect.ALLOW,
  actions: [ 'lambda:InvokeFunction' ],
  resources: [ '*' ]
}));
Run Code Online (Sandbox Code Playgroud)