はじめに
CloudFormationでFargate を作ろうとしてハマったのでメモ。
状況
- すでに手動でECS クラスタを作成済み
- 同一VPC内に類似したECSクラスタを作成したい
- 面倒なので、Former2で生成したCloudFormationテンプレートで作成したい
エラー内容
Resource handler returned message: "Invalid request provided: CreateService error: You cannot specify an IAM role for services that require a service linked role
- CreateServiceのエラーです。サービスリンクロールを必要とするサービスにIAMロールを指定することはできません。
実行した CFn template(一部抜粋)
ECSService: Type: "AWS::ECS::Service" Properties: ServiceName: !Sub "${ENV}-service-frontend" Cluster: !GetAtt ECSCluster.Arn LoadBalancers: - TargetGroupArn: !Ref ElasticLoadBalancingV2TargetGroup2 ContainerName: !Sub "${ENV}-container-front" ContainerPort: 80 DesiredCount: 2 LaunchType: "FARGATE" PlatformVersion: "LATEST" TaskDefinition: !Ref ECSTaskDefinition2 DeploymentConfiguration: MaximumPercent: 200 MinimumHealthyPercent: 100 DeploymentCircuitBreaker: Enable: false Rollback: false Role: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS"
対策
公式ドキュメントによると、
- アカウントですでにAmazonECSサービスにリンクされたロールが作成されている場合、ここでロールを指定しない限り、そのロールがデフォルトでサービスに使用されます。
とのことなので、上記のtemplateから、 Role: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS"
をコメントアウトする。