如何解决带有 EventBridge 任务“NotAuthorizedForSourceException”的 Step Function
背景
我正在创建一个 Step Function 状态机,一旦定义的 AWS CodePipeline 的执行状态为 SUCCEED
,它就会启动 AWS CodeBuild。我在 Step Function 中使用 .waitForTaskToken
功能等待 CodePipeline 通过 CloudWatch 事件成功。管道成功后,事件会将令牌发送回 step 函数并运行 CodeBuild。
这里是阶跃函数定义:
{
"StartAt": "PollCP","States": {
"PollCP": {
"Next": "UpdateCP","Parameters": {
"Entries": [
{
"Detail": {
"Pipeline": [
"bar-pipeline"
],"State": [
"SUCCEEDED"
],"TaskToken.$": "$$.Task.Token"
},"DetailType": "CodePipeline Pipeline Execution State Change","Source": "aws.codepipeline"
}
]
},"Resource": "arn:aws:states:::events:putEvents.waitForTaskToken","Type": "Task"
},"UpdateCP": {
"End": true,"Parameters": {
"ProjectName": "foo-project"
},"Resource": "arn:aws:states:::codebuild:startBuild.sync","Type": "Task"
}
}
}
step 函数的权限:
{
"Version": "2012-10-17","Statement": [
{
"Sid": "","Effect": "Allow","Action": "codebuild:StartBuild","Resource": "*"
},{
"Sid": "","Action": "codepipeline:*","Resource": "*"
}
]
}
和arn:aws:iam::aws:policy/CloudWatchEventsFullAccess
问题
step 函数中的 cloudwatch 事件返回错误:
Error
EventBridge.FailedEntry
Cause
{
"Entries": [
{
"ErrorCode": "NotAuthorizedForSourceException","ErrorMessage": "Not authorized for the source."
}
],"FailedEntryCount": 1
}
尝试:
- 修改关联的 Codepipeline 和 Codebuild 角色,以获得发送任务状态的 step 函数权限。具体来说,权限是:
{
"Effect": "Allow","Action": [
"states:SendTaskSuccess","states:SendTaskFailure","states:SendTaskHeartbeat"
],"Resource": "*"
}
遇到上述相同的原始错误。
-
修改关联 Step Function 机器的权限,以获得对所有 Step Function 操作和资源的完全访问权限。得到了与上述相同的原始错误。
-
使用默认的 AWS EventBridge 总线测试
PollCP
步骤函数任务中指定的事件规则。事件是:
{
"version": "0","detail-type": "CodePipeline Pipeline Execution State Change","source": "aws.codepipeline","account": "123456789012","time": "2021-06-14T00:44:41Z","region": "us-west-2","resources": [],"detail": {
"pipeline": "<pipeline-arn>","state": "SUCCEED"
}
}
该事件输出了与上述相同的错误。这可能意味着错误与上面代码片段中提到的事件条目密切相关。
解决方法
当 CodePipeline 管道完成/成功时,您是否尝试使用 CloudWatch 事件触发状态机?
如果是这样,您就无法在状态机中定义触发器。 与 EventBridge 的集成并不是让状态机可以由事件触发。而是将事件从您的状态机或工作流发布到事件总线。
因此,我建议您创建 CloudWatch 规则并改为以您的状态机为目标。
如果你想使用 waitForTaskToken 模式。您将必须使用 send_task_success API 调用(以下 Python/boto3 示例)显式返回该令牌。
sfn.send_task_success(
taskToken=task_token,output=json.dumps(some_optional_payload)
)
这意味着,当步骤执行时,它会将事件发布到 EventBridge 总线。您必须在状态机之外检测此事件,很可能使用 CloudWatch 事件规则。然后从规则触发一个 lambda 函数。 lambda 函数执行 send_task_success API 调用,该调用会重新启动/继续您的工作流/状态机。
在我看来,这是不必要的。就像我说的,你可以简单地使用 CW 事件规则观察管道执行状态的变化,触发你的状态机,你的状态机从 CodeBuild 阶段开始。
旁注:很高兴看到人们将 Step Functions 用于 CI/CD 管道。它只是获得了更多的灵活性和能力来执行复杂的分支策略。可能很快就会写一篇关于这个的博文。
,您的 CodeBuild 服务角色将需要使用 ["Posts","Posts & replies","Media","Likes"]
(states:SendTask*
、Success
和 Failure
)actions 的权限,以便它可以通知状态机器。文档中的 This page 有更多详细信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。