ECS Fargate をオートスケールしたい
ECS Fargate をオートスケールさせたいので、適切なマネージドポリシーを検索したところ
AWSApplicationAutoscalingECSServicePolicy
というポリシーが見つかりました。
これを CDK で利用するために以下のコードを実装しました。
import * as autoscaling from '@aws-cdk/aws-applicationautoscaling' import * as iam from '@aws-cdk/aws-iam' 〜〜略〜〜 // IAM Role const applicationAutoscalingRole = new iam.Role(this, 'ApplicationAutoscalingEcsRole', { roleName: 'application-autoscaling-role', assumedBy: new iam.ServicePrincipal('application-autoscaling.amazonaws.com'), managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName( 'aws-service-role/AWSApplicationAutoscalingECSServicePolicy' ), ], })
アタッチできないエラーが発生
このコードをデプロイしてみると、以下のエラーが発生しました。
Cannot attach a Service Role Policy to a Customer Role.
「カスタマーロールに、サービスロールはアタッチすることができない」というエラーが発生。
このエラーが出たのが初めてだったので、ドキュメントを見てみると
Amazon Elastic Container Service 用の AWS マネージドポリシー - Amazon ECS
AWSApplicationAutoscalingECSServicePolicy
IAM エンティティに AWSApplicationAutoscalingECSServicePolicy をアタッチすることはできません。このポリシーは、ユーザーに代わって Application Auto Scaling がアクションを実行することを許可する、サービスにリンクされたロールにアタッチされます。
アタッチできないロールというのがあるんですね。
aws-service-role/
というパスも初めてみたので、このパスが付いているものが使えないと思われます。
別途ポリシーを設定して対応
アタッチできないので、このマネージドポリシーを参考にして必要なロールを抜き出して設定することにしました。
// IAM Role const applicationAutoscalingRole = new iam.Role(this, 'ApplicationAutoscalingEcsRole', { roleName: 'application-autoscaling-role', assumedBy: new iam.ServicePrincipal('application-autoscaling.amazonaws.com'), /* // `aws-service-role` なのでアタッチできない managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName( 'aws-service-role/AWSApplicationAutoscalingECSServicePolicy' ), ], */ }) applicationAutoscalingRole.addToPolicy( new iam.PolicyStatement({ effect: iam.Effect.ALLOW, resources: ['*'], actions: [ 'ecs:DescribeServices', 'ecs:UpdateService', 'cloudwatch:DescribeAlarms', ], }) )
この IAM を利用することで無事に ECS Fargate のオートスケールができました。