当使用外部ID假定角色时,AWS NodeJS SDK无法创建Lambda函数。这可能是因为创建函数时需要使用的IAM角色与假定的角色不同。
解决方法是使用aws-sdk
中的STS
(Security Token Service)服务来获取临时凭证,并在创建Lambda函数时使用这些凭证。以下是一个示例代码,演示如何使用STS服务创建Lambda函数:
const AWS = require('aws-sdk');
// 要使用的IAM角色的ARN
const assumedRoleArn = 'arn:aws:iam::account-id:role/your-role-name';
// 要获取外部ID的IAM角色的ARN
const roleArn = 'arn:aws:iam::account-id:role/your-role-name';
// 要使用的AWS服务的区域
const region = 'us-west-2';
// 创建STS服务对象
const sts = new AWS.STS({ region });
// 获取临时凭证
sts.assumeRole({
RoleArn: assumedRoleArn,
RoleSessionName: 'lambda-session',
ExternalId: 'your-external-id'
}, (err, data) => {
if (err) {
console.error(err);
} else {
// 创建Lambda服务对象
const lambda = new AWS.Lambda({
region,
accessKeyId: data.Credentials.AccessKeyId,
secretAccessKey: data.Credentials.SecretAccessKey,
sessionToken: data.Credentials.SessionToken
});
// 创建Lambda函数
lambda.createFunction({
FunctionName: 'my-function',
Runtime: 'nodejs',
Role: 'arn:aws:iam::account-id:role/your-role-name',
Handler: 'index.handler',
Code: {
S3Bucket: 'my-function-bucket',
S3Key: 'my-function.zip'
}
}, (error, result) => {
if (error) {
console.error(error);
} else {
console.log(result);
}
});
}
});
在上面的示例代码中,sts.assumeRole
方法用于获取临时凭证。然后,在创建Lambda函数时,将这些凭证作为accessKeyId
,secretAccessKey
和sessionToken
参数传递给AWS.Lambda
服务对象。这样,AWS NodeJS SDK就可以使用正确的IAM角色来创建Lambda函数。