アタッチできないロールがある - omuronの備忘録

omuronの備忘録

個人的な備忘録

アタッチできないロールがある

ECS Fargate をオートスケールしたい

ECS Fargate をオートスケールさせたいので、適切なマネージドポリシーを検索したところ
AWSApplicationAutoscalingECSServicePolicy というポリシーが見つかりました。

f:id:omron:20210905123734p:plain

これを 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 のオートスケールができました。