使用 AWS CDK 为 lambda 指定自定义角色
Specifying a custom role for lambda with the 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());
为了尝试为该函数指定一个现有的 IAM 角色,但这似乎不是正确的语法。我也可以(或者甚至更喜欢)动态生成特定于此 lambda 的自定义角色,但我也没有看到有关如何执行此操作的任何示例。
有没有人知道如何做到这一点?
Lambda自带执行角色,已经具备基本的执行权限。如果您想为其拥有的角色添加额外的权限,请执行以下操作:
import * as iam from '@aws-cdk/aws-iam';
lambda.addToRolePolicy(new iam.PolicyStatement()
.addResource('arn:aws:....')
.addAction('s3:GetThing'));
或者更好的是,使用一种方便的功能来获取某些资源的权限:
bucket.grantRead(lambda.role);
@rix0rrr 接受的答案不再有效。似乎 CDK 得到了一些更新。当前版本为
"@aws-cdk/core": "^1.1.0"
更新代码:
import iam = require("@aws-cdk/aws-iam");
const statement = new iam.PolicyStatement();
statement.addActions("lambda:InvokeFunction");
statement.addResources("*");
lambda.addToRolePolicy(statement);
Bill 的回答有效,但还有另一种方法:
import iam = require("@aws-cdk/aws-iam");
lambda.addToRolePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [ 'lambda:InvokeFunction' ],
resources: [ '*' ]
}));
即使 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")
]
})
如果 lambda 不需要在 VPC 中,您可以跳过 AWSLambdaVPCAccessExecutionRole。
并将此角色分配给 lambda 函数:
const lambda = new lambda.Function(this, 'lambda', {
runtime:....,
code:...,
role: customRole,
handler:....,
memorySize:...,
timeout:....,
vpc:...,
environment: {
....
}
});
我遇到过类似的情况,找到了类似
的答案
import * as lambda from '@aws-cdk/aws-lambda';
import iam = require("@aws-cdk/aws-iam");
// define lambda fucntion
const lambdaFunction = new lambda.Function(this, 'my-lambda', {
code: this.lambdaCode,
functionName: 'athena-gateway',
handler: 'index.handler',
runtime: lambda.Runtime.NODEJS_12_X,
timeout: Duration.minutes(14)
});
// provide athena,s3 access to lambda function
const athenaAccessPolicy = new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [
"s3:*",
"athena:*" ]
});
athenaAccessPolicy.addAllResources();
lambdaFunction.addToRolePolicy(athenaAccessPolicy)
我在 lambda 创建过程中未能成功添加角色,但下一段代码让 lambda 可以访问在另一个 CDK 中创建的外部角色:
lambdaFn.addToRolePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [ "sts:AssumeRole" ],
resources: [externalRoleArn]
}))
我知道它很新,但我没有看到任何语言的示例如何为使用 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());
为了尝试为该函数指定一个现有的 IAM 角色,但这似乎不是正确的语法。我也可以(或者甚至更喜欢)动态生成特定于此 lambda 的自定义角色,但我也没有看到有关如何执行此操作的任何示例。
有没有人知道如何做到这一点?
Lambda自带执行角色,已经具备基本的执行权限。如果您想为其拥有的角色添加额外的权限,请执行以下操作:
import * as iam from '@aws-cdk/aws-iam';
lambda.addToRolePolicy(new iam.PolicyStatement()
.addResource('arn:aws:....')
.addAction('s3:GetThing'));
或者更好的是,使用一种方便的功能来获取某些资源的权限:
bucket.grantRead(lambda.role);
@rix0rrr 接受的答案不再有效。似乎 CDK 得到了一些更新。当前版本为
"@aws-cdk/core": "^1.1.0"
更新代码:
import iam = require("@aws-cdk/aws-iam");
const statement = new iam.PolicyStatement();
statement.addActions("lambda:InvokeFunction");
statement.addResources("*");
lambda.addToRolePolicy(statement);
Bill 的回答有效,但还有另一种方法:
import iam = require("@aws-cdk/aws-iam");
lambda.addToRolePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [ 'lambda:InvokeFunction' ],
resources: [ '*' ]
}));
即使 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")
]
})
如果 lambda 不需要在 VPC 中,您可以跳过 AWSLambdaVPCAccessExecutionRole。
并将此角色分配给 lambda 函数:
const lambda = new lambda.Function(this, 'lambda', {
runtime:....,
code:...,
role: customRole,
handler:....,
memorySize:...,
timeout:....,
vpc:...,
environment: {
....
}
});
我遇到过类似的情况,找到了类似
的答案
import * as lambda from '@aws-cdk/aws-lambda';
import iam = require("@aws-cdk/aws-iam");
// define lambda fucntion
const lambdaFunction = new lambda.Function(this, 'my-lambda', {
code: this.lambdaCode,
functionName: 'athena-gateway',
handler: 'index.handler',
runtime: lambda.Runtime.NODEJS_12_X,
timeout: Duration.minutes(14)
});
// provide athena,s3 access to lambda function
const athenaAccessPolicy = new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [
"s3:*",
"athena:*" ]
});
athenaAccessPolicy.addAllResources();
lambdaFunction.addToRolePolicy(athenaAccessPolicy)
我在 lambda 创建过程中未能成功添加角色,但下一段代码让 lambda 可以访问在另一个 CDK 中创建的外部角色:
lambdaFn.addToRolePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [ "sts:AssumeRole" ],
resources: [externalRoleArn]
}))