サービスロールが原因で消せなくなってしまったAWS Batchコンピューティング環境を消してみた

こんなエラーみたことありませんか? INVALID - CLIENT_ERROR - User: batch.amazonaws.com is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::XXXXXXXXXXX:role/service-role/AWSBatchServiceRole
2021.03.27

こんにちはAWS事業本部のKyoです。

AWS Batchユーザのみなさま、以下のようなエラーに遭遇したことはないでしょうか?

INVALID - CLIENT_ERROR - User: batch.amazonaws.com is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::XXXXXXXXXXX:role/service-role/AWSBatchServiceRole

この状態になってしまうと、Batchのコンピューティング環境への操作ができなくなり、コンピューティング環境を消せない、という状態になります。

発生条件

Batchのコンピューティング環境は存在するが、紐付けられているサービスロール(デフォルトではAWSBatchServiceRole)が存在しない状態で環境に対して無効化や削除などの操作を行うと発生します。

私が経験したのは、以下のような流れでした。

  • CloudFormationでサービスロールを含むIAM, Batchを別スタックとして構築
  • それぞれのスタックを削除
    • IAMは正常に削除された
    • Batchのコンピューティング環境がなんらかの理由で残ってしまった

検証にあたっては、マネジメントコンソールからサービスロールを削除することで再現させています。

解決方法

解決方法はシンプルで、本来あるべきサービスロールを作成することです。

ここで、1つポイントがあります。

マネジメントコンソール経由でサービスロールを作成しようとすると、ロールのパスが/になります。

通常サービスロールは/service-role/以下に存在します。これはARNにも影響します。

AWSBatchServiceRoleのARNは本来以下のようになるはずです。

arn:aws:iam::<AWS ACCOUNT ID>:role/service-role/AWSBatchServiceRole

一方、マネジメントコンソール経由で作成すると以下のようになります。

arn:aws:iam::<AWS ACCOUNT ID>:role/AWSBatchServiceRole

これを防ぐために、パスを指定した状態でサービスロールを作成するには以下の2つの方法があります。

  1. CloudFormation
  2. AWS CLI

今回はCloudFormationで作成してみました。

以下のテンプレートを実行すると/service-role/以下にAWSBatchServiceRoleが作成されます。

AWSBatchServiceRoleという名前のIAMロールを作成し、AWSBatchServiceRoleというAWS管理のIAMポリシーを付与しているだけです(ポリシーの名前もRoleとなっているのが若干混乱しますね。。)。

ポリシーの詳細はこのドキュメントにまとまっています。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  AWSBatchServiceRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: AWSBatchServiceRole
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - 'batch.amazonaws.com'
            Action:
              - 'sts:AssumeRole'
      Path: /service-role/
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSBatchServiceRole

これで、コンピューティング環境の削除を行えるようになりました。

※ サービスロールを作成しても、コンピューティング環境に操作を行わない限りはエラーの状態で表示されます。

コンピューティング環境の削除後、サービスロールが不要な場合はスタックも削除してください。

おわりに

今回はサービスロールが存在しないことで、消せなくなってしまったBatchのコンピューティング環境を削除しました。

おそらくレアなケースで、実害もそこまで大きくないものの、環境を削除できない状態はモヤモヤしてしまうものです。もしモヤモヤを抱えている場合は上記の方法をお試しいただければと思います。

以上何かのお役に立てれば幸いです。

参考