我正在关注AWS Step Functions tutorial。整个状态机过程就是这样。
我有一个名为{strong> step_functions_basic_execution 的角色,具有策略AWSLambdaRole
。我的Step功能状态机正在使用此角色。
我的步进功能是
{
"Comment": "A simple AWS Step Functions state machine that automates a call center support session.",
"StartAt": "Open Case",
"States": {
"Open Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-west-2:829495130000:function:OpenCaseFunction",
"Next": "Assign Case"
},
...
}
相应的 Open Case Lambda函数是
exports.handler = (event, context, callback) => {
// Create a support case using the input as the case ID, then return a confirmation message
var myCaseID = event.inputCaseID;
var myMessage = "Case " + myCaseID + ": opened...";
var result = {Case: myCaseID, Message: myMessage};
callback(null, result);
};
当我尝试运行它时,它在第一步打开案例中失败。
输入为
{
"inputCaseID": "001"
}
它引发错误:
States.TaskFailed
全球服务负责人states.amazonaws.com和 区域一级被授权承担提供的角色。
任何想法如何解决?谢谢
答案 0 :(得分:1)
仔细检查该页面的步骤2、3和4中的所有内容。不幸的是,该错误消息的详细程度不足以使我们确切了解发生了什么,但这是通过IAM设置的。
答案 1 :(得分:1)
角色需要有如下描述:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "states.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
看服务名称:states.amazonaws.com 不是 lambda.amazonaws.com
再见!
答案 2 :(得分:0)
感谢Joel Kinzel的指南。这是我的错误。
在步骤2c中我做错了。
在Create Roles屏幕上,保持AWS服务处于选中状态,选择Step 功能
我选择了 Lambda 而不是 Step Functions ,即使我仍在下一页上添加了AWSLambdaRole
,但这仍然无济于事。
答案 3 :(得分:0)
您需要创建两个角色: 一种) Lambda的IAM角色(LambdaExecutionRole)。此角色不需要任何策略,并且不需要以下信任关系定义:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
B)第二个角色(StatesExecutionRole)是让StateMachine能够调用lambda函数。这些角色需要以下策略定义:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
并且需要这种信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "states.us-east-2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
需要将LambdaExecutionRole分配给您的lambda。 需要将StatesExecutionRole分配为用于执行StateMachine的角色。
答案 4 :(得分:0)
我知道这是一个旧帖子并且已经被批准为已解决, 但也许这会帮助某人...
我遇到了类似的错误,但使用了另一个 aws 指南来创建角色: https://docs.amazonaws.cn/en_us/step-functions/latest/dg/tutorial-lambda-state-machine-cloudformation.html#lambda-state-machine-cfn-create-role
我的案例的问题与地区有关。
我从 eu-west-1 区域运行 StepFunction 并得到与问题中发布的相同的错误:
States.TaskFailed
Neither the global service principal states.amazonaws.com, nor the regional
one is authorized to assume the provided role.
尽管我的 stepFunction 角色配置与指南中描述的完全相同:
StatesExecutionRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service:
- !Sub states.${AWS::Region}.amazonaws.com
Action: "sts:AssumeRole"
Path: "/"
Policies:
- PolicyName: StatesExecutionPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "lambda:InvokeFunction"
Resource: "*"
创建角色后,我注意到我的角色的受信任实体是:
"states.us-east-1.amazonaws.com"
所以,这就是为什么我不能从 us-east-1 以外的其他地区运行 SFN。 因此,如果您使用相同的指南,请注意从中创建的可信实体。 我最终将角色更改为通用服务配置(“states.amazonaws.com”),如下所示:
StatesExecutionRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service:
- "states.amazonaws.com"
Action: "sts:AssumeRole"
Path: "/"
Policies:
- PolicyName: StatesExecutionPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "lambda:InvokeFunction"
Resource: "*"
这解决了我的问题。