J'ai configuré un événement de règle Cloudwatch où une définition de tâche ECS est démarrée lorsqu'une définition de tâche précédente est terminée.
Je peux voir l'événement déclencher la définition de la tâche, mais elle échoue.
La seule visibilité de cet échec se trouve dans les métriques de règle, où je vois les invocations d'échec de la métrique.
Question, existe-t-il des journaux pour voir pourquoi le déclencheur a échoué?
Je peux configurer manuellement la règle via la console de gestion et tout fonctionne bien.
L'erreur se produit lorsque j'ai configuré la règle via un modèle de cloudformation.
J'ai comparé les deux règles et les deux sont identiques, sauf le rôle. Cependant, les deux rôles ont les mêmes autorisations.
Cela nous a bloqué pendant des siècles, le principal problème est le problème de rôle mentionné par Nathan B, mais quelque chose d'autre qui nous a fait trébucher est que les conteneurs programmés ne fonctionneront pas en mode awsvpc
(et par extension Fargate). Voici un exemple de modèle 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
Remarque: J'ai ajouté le ClusterArn en tant que paramètre au script mais bien sûr, il est préférable de le faire avec une instruction CloudFormation ImportValue
.
Il y a deux rôles dont vous devez vous soucier, le premier est le rôle (TaskRole
) pour la tâche elle-même: dans cet exemple, le conteneur envoie simplement un e-mail à l'aide de SES afin qu'il dispose des autorisations nécessaires. Le deuxième rôle (CloudWatchEventECSRole
) est celui qui fait tout fonctionner, notez que dans son tableau Policies
le principe est events.amazonaws.com
et la ressource est la tâche ECS définie dans le modèle.
Ce problème était dû au fait de ne pas définir les principaux services pour inclure events.amazonaws.com. La tâche ne pouvait pas assumer le rôle.
Shame aws n'a pas de meilleure journalisation pour les invocations infructueuses.
Si la règle a été correctement déclenchée, mais que l'appel sur la cible a échoué, vous devriez voir une trace de l'appel d'API dans l'historique des événements à l'intérieur d'AWS CloudTrail en regardant les propriétés errorCode
et errorMessage
:
{
[..]
"errorCode": "InvalidInputException",
"errorMessage": "Artifacts type is required",
[..]
}
Au cas où d'autres personnes viendraient ici à la recherche de la configuration nécessaire pour que cela fonctionne pour une tâche dans Fargate. Il y a une configuration supplémentaire en plus de la réponse de Stefano. L'exécution de tâches dans Fargate nécessite la configuration d'un rôle d'exécution, vous devez donc activer CloudWatchEventECSRole pour l'utiliser. Ajoutez cette déclaration à ce rôle:
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::<account>:role/<executionRole>"
]
}
Pour ceux qui ont du mal à configurer des tâches planifiées sur Fargate et qui utilisent Terraform pour configurer leur cloud, jetez un œil à ce module. https://github.com/dxw/terraform-aws-ecs-scheduled-task
Il aide à configurer les tâches planifiées via CloudEvents et définit les rôles IAM appropriés.
J'ai passé des heures à essayer de résoudre ce problème, lors de la création d'une tâche planifiée ECS via la ligne de commande, la tâche a été créée mais n'a jamais démarré. Merci pour ce post, j'ai découvert en regardant EventHistory dans CloudTrail que les instances ECS étaient toutes mortes et qu'aucune instance EC2 n'était en cours d'exécution!
{
[..]
"errorCode": "InvalidParameterException",
"errorMessage": "No Container Instances were found in your cluster.",
[..]
}