以前のタスク定義が完了したときにECSタスク定義が開始されるCloudwatchルールイベントを設定しました。
イベントはタスク定義をトリガーしますが、失敗します。
この失敗の唯一の可視性は、ルールのメトリックにあります。ここでは、失敗したメトリックが表示されます。
質問、トリガーが失敗した理由を確認するためのログはありますか?
管理コンソールを介して手動でルールを設定でき、すべてが正常に動作します。
Cloudformationテンプレートを使用してルールを設定すると、エラーが発生します。
私は2つのルールを比較しましたが、役割を除いてどちらも同じです。ただし、両方の役割には同じ権限があります。
これは何年もの間私たちを困らせました、主な問題はネイサンBが言及する役割の問題ですが、私たちをつまずかせた他の何かは、スケジュールされたコンテナーが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
注:ClusterArnをパラメーターとしてスクリプトに追加しましたが、もちろん、CloudFormation ImportValue
ステートメントを使用してこれを行うことをお勧めします。
注意する必要がある2つの役割があります。1つ目はタスク自体の役割(TaskRole
)です。この例では、コンテナーはSESを使用して電子メールを送信するだけなので、必要な権限を持っています。 2番目の役割(CloudWatchEventECSRole
)は、すべてを機能させる役割です。Policies
配列の原則はevents.amazonaws.com
であり、リソースはテンプレートで定義されたECSタスクです。 。
この問題は、主要サービスにevents.amazonaws.comを含めるように設定していないことが原因でした。タスクが役割を引き受けることができませんでした。
Shame awsは、失敗した呼び出しに対するより優れたロギングを備えていません。
ルールが正常にトリガーされたが、ターゲットでの呼び出しが失敗した場合、errorCode
プロパティとerrorMessage
プロパティを調べて、AWS CloudTrail内のイベント履歴にAPI呼び出しのトレースが表示されます。 :
{
[..]
"errorCode": "InvalidInputException",
"errorMessage": "Artifacts type is required",
[..]
}
他の人がここに来てFargateのタスクでこれを機能させるために必要なセットアップを探している場合。ステファノの答えに加えていくつかの追加の構成があります。 Fargateでタスクを実行するには、実行ロールを設定する必要があるため、CloudWatchEventECSRoleがそれを使用できるようにする必要があります。このステートメントをその役割に追加します。
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::<account>:role/<executionRole>"
]
}
Fargateでスケジュールされたタスクの設定に苦労していて、Terraformを使用してクラウドを設定しようとしている人は、このモジュールをご覧ください。 https://github.com/dxw/terraform-aws-ecs-scheduled-task
CloudEventsを介してスケジュールされたタスクを設定し、正しいIAMロールを設定するのに役立ちます。
コマンドラインからECSのスケジュールされたタスクを作成すると、タスクは作成されたが開始されなかったため、これをトラブルシューティングしようと何年も費やしました。この投稿をありがとう、CloudTrailのEventHistoryを調べたところ、ECSインスタンスがすべて停止していて、EC2インスタンスが実行されていないことがわかりました。
{
[..]
"errorCode": "InvalidParameterException",
"errorMessage": "No Container Instances were found in your cluster.",
[..]
}