lzn*_*znt 8 amazon-web-services amazon-ecs aws-cloudformation amazon-cloudwatch
我有一个 AWS::Event::Rule 将 S3 put 事件路由到 ECS 任务。我可以看到规则是从指标触发的,但也可以看到每个触发器上的 FailedInvocation。我怀疑这是权限/策略问题,但无法找到任何调试信息或日志。这些调试信息在某处可用吗?
我看到 Lambda 作为目标的类似问题,它需要 Lambda 端的额外权限以允许从事件触发,但无法找到 ECS 的类似设置? AWS Cloudformation - 通过规则事件调用 Lambda 失败
这是相关的 CloudFormation 代码,它显示了 ECS 目标的当前角色:
Resources:
ECSTrigger:
Type: AWS::Events::Rule
Properties:
...
Targets: # target of trigger: ECS
- Arn:
Fn::Sub: 'arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${ClusterName}'
Id: 'EcsTriggerTarget'
InputTransformer:
InputPathsMap:
s3_bucket: "$.detail.requestParameters.bucketName"
s3_key: "$.detail.requestParameters.key"
InputTemplate: '{"containerOverrides": [{"environment": [{"name": "S3_BUCKET", "value": <s3_bucket>}, {"name": "S3_KEY", "value": <s3_key>}]}]}'
EcsParameters:
LaunchType: FARGATE
PlatformVersion: LATEST
TaskCount: 1
TaskDefinitionArn:
Ref: Task
NetworkConfiguration:
AwsVpcConfiguration:
AssignPublicIp: DISABLED
SecurityGroups: ...
Subnets: ...
RoleArn:
Fn::GetAtt: EcsTriggerRole.Arn
EcsTriggerRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: 'sts:AssumeRole'
Principal:
Service: 'events.amazonaws.com'
ManagedPolicyArns:
- Fn::Sub: 'arn:${AWS::Partition}:iam::aws:policy/service-role/AmazonEC2ContainerServiceEventsRole'
Run Code Online (Sandbox Code Playgroud)
Unb*_*ess 20
我刚刚遇到了类似的情况。我已配置 EventBridge 规则来定期运行 ECS 任务,但我观察到 ECS 任务未被调用。
然后我检查了RunTaskCloudTrail中的事件,终于发现了一条明确的错误消息:
User: arn:aws:sts::xxxx:assumed-role/Amazon_EventBridge_Invoke_ECS/xxx is not authorized to perform: ecs:RunTask on resource: arn:aws:ecs:us-east-1:xxxx:task-definition/ECS_task
Run Code Online (Sandbox Code Playgroud)
这表明与该规则关联的角色没有足够的权限来拉取 docker 映像。
小智 12
就我而言,我有一个 Eventbridge 规则来从 AWS Config 中获取事件并将其发送到 SNS 主题。
当从 AWS Config 触发该事件时,我可以看到它被监控选项卡图表(调用和失败调用)下的 Event Bridge 拾取,但它从未到达 SNS 主题。
这非常难以调试。我无法从 Cloudwatch 和 Cloudtrail 找到任何信息。在设置死信队列(由 SQS 创建)来抓取目标的失败交付后,终于取得了突破。
在检查 DLQ 时我可以看到
我的输入变压器有问题。因此,我强烈建议为您的规则设置 DLQ,以获取有关未处理事件的更多信息。
我今天与 AWS 的一名支持工程师讨论了这个问题。根据他们的说法,调试任何 FailedInvocation 问题必须在资源级别完成,不能在 EventBridge 级别调试。从我们的聊天:
我刚刚从内部 cloudwatch 团队确认,cloudwatch 不提供任何失败调用的日志。除了失败调用指标外,cloudwatch 端没有可用的日志记录。如前所述,您需要依赖 lambda 日志或资源日志。
换句话说,如果您的规则调用 ECS(资源),则唯一可用的调试日志来自 ECS 而不是来自 EventBridge。我要求支持工程师代表我的团队提交功能请求,因此您也可以考虑通过 AWS Support 渠道执行此操作。
看来问题是我错过了 InputTemplate 中“containerOverrides”内的“名称”,当我这样写时它就可以工作:
InputTemplate:
Fn::Sub: >-
{ "containerOverrides": [ {
"name": "${ServiceContainerName}",
"environment": [
{ "name":"S3_BUCKET", "value":<s3_bucket> },
{ "name":"S3_KEY", "value":<s3_key> } ]
} ] }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2829 次 |
| 最近记录: |