Nat*_*n B 12 amazon-ec2 amazon-web-services amazon-ecs aws-cloudformation amazon-cloudwatch
我已经设置了一个Cloudwatch规则事件,其中在完成上一个任务定义时启动了ECS任务定义.
我可以看到事件触发任务定义但是它失败了.
此失败的唯一可见性是在规则指标中,我在其中看到指标failedinnvocations.
问题,是否有任何日志可以查看触发器失败的原因?
我可以通过管理控制台手动设置规则,一切正常.
通过云信息模板设置规则时发生错误.
我比较了两个规则,两者都是相同的,除了角色.但是,两个角色具有相同的权限.
Nic*_*rbé 22
如果规则已成功触发,但对目标的调用失败,您应该在 AWS CloudTrail 内的事件历史记录中看到 API 调用的跟踪,查看errorCode和errorMessage属性:
{
[..]
"errorCode": "InvalidInputException",
"errorMessage": "Artifacts type is required",
[..]
}
Run Code Online (Sandbox Code Playgroud)
bar*_*kbd 15
CloudTrail 日志有所帮助。事件名称是 RunTask。问题是:“errorCode”:“InvalidParameterException”,“errorMessage”:“覆盖名为 rds-task 的容器不是 TaskDefinition 中的容器。”,
用于调试 CloudWatch 事件的 AWS 文档位于:https ://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CWE_Troubleshooting.html
我打开了一个 PR 来添加用于从 CloudWatch Events 调试失败的 ECS 任务调用的文档:https :
//github.com/awsdocs/amazon-cloudwatch-events-user-guide/pull/12/files
这让我们困扰了很多年,主要问题是Nathan B提到的角色问题,但是让我们绊倒的其他事情是Scheduled Containers将无法在awsvpc模式下工作(并且通过扩展Fargate).这是一个示例CloudFormation模板:
---
AWSTemplateFormatVersion: 2010-09-09
Description: Fee Recon infrastructure
Parameters:
ClusterArn:
Type: String
Description: The Arn of the ECS Cluster to run the scheduled container on
Resources:
TaskRole:
Type: AWS::IAM::Role
Properties:
Path: /
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- ecs-tasks.amazonaws.com
Version: 2012-10-17
Policies:
- PolicyName: TaskPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- 'ses:SendEmail'
- 'ses:SendRawEmail'
Resource: '*'
TaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
TaskRoleArn: !Ref TaskRole
ContainerDefinitions:
- Name: !Sub my-container
Essential: true
Image: !Sub <aws-account-no>.dkr.ecr.eu-west-1.amazonaws.com/mycontainer
Memory: 2048
Cpu: 1024
CloudWatchEventECSRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- events.amazonaws.com
Action:
- sts:AssumeRole
Path: /
Policies:
- PolicyName: CloudwatchEventsInvokeECSRunTask
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: 'ecs:RunTask'
Resource: !Ref TaskDefinition
TaskSchedule:
Type: AWS::Events::Rule
Properties:
Description: Runs every 10 minutes
Name: ScheduledTask
ScheduleExpression: cron(0/10 * * * ? *)
State: ENABLED
Targets:
- Id: ScheduledEcsTask
RoleArn: !GetAtt CloudWatchEventECSRole.Arn
EcsParameters:
TaskDefinitionArn: !Ref TaskDefinition
TaskCount: 1
Arn: !Ref ClusterArn
Run Code Online (Sandbox Code Playgroud)
注意:我已将ClusterArn作为参数添加到脚本中,但当然最好使用CloudFormation ImportValue语句执行此操作.
您需要关注两个角色,第一个是TaskRole任务本身的角色():在此示例中,容器只使用SES发送电子邮件,因此它具有必要的权限.第二个角色(CloudWatchEventECSRole)是使其全部工作的角色,请注意,在其Policies数组中,原则是events.amazonaws.com,资源是模板中定义的ECS任务.
以防其他人来到这里寻找必要的设置,以便在 Fargate 中完成任务。除了 Stefano 的回答之外,还有一些额外的配置。在 Fargate 中运行任务需要设置执行角色,因此您需要启用 CloudWatchEventESCRole 才能使用它。将此语句添加到该角色:
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::<account>:role/<executionRole>"
]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3689 次 |
| 最近记录: |