AWS Batch でジョブを実行するとコンピューティング環境のステータスに SpotFleetRequestConfig.IamFleetRole is invalid. と表示されて失敗したときの原因と対応方法

2022.04.01

AWS Batch マネージド型の EC2 Spot のコンピューティング環境でジョブを実行したら、コンピューティング環境のステータスに以下のエラーメッセージが表示されたときの原因と対応方法を紹介します。

エラーメッセージ

SpotFleetRequestConfig.IamFleetRole is invalid.

原因・対応方法

原因

スポットフリートロールのIAMロール指定を誤っている可能性がある。

対応

  1. 正しいIAMロールを作成
  2. コンピューティング環境を新規作成
  3. 正しいIAMロールをスポットフリートロールに指定

正しいIAMロールの作成手順は以降の本文を参考にしてください。

調査

エラーメッセージで検索して以下のリンクを参考になりました。しかし、2022年4月現在のマネジメントコンソールからだとそのままの内容で対応できませんでした。代りに AWS CLI を利用して必要なリソース作成し対応しました。その記録です。

AWS Batch で有効でないコンピューティング環境を修正する

上記のリンクかの有効でないSpot Fleet ロールを修正するの内容から Spot Fleet の IAMロールの指定の誤りがわかりました。

必要なIAMロールを作成しようとユースケースに指示のあるEC2 Spot Flee Roleが見つかりません。

マネジメントコンソールからの操作は諦めて、AWS CLI で必要な IAMロールを作成することにしました。

ワークアラウンド

以下のリンクより AWS CLI で必要な IAMロールを作成する手順を実行します。

Create Amazon EC2 Spot Fleet Roles with the AWS CLI

Amazon EC2 spot fleet role - AWS Batch

実行ログ

必要な権限をもつAmazonEC2SpotFleetTaggingRoleという名前のIAMロールを作成します。

# IAMロール作成
$ aws iam create-role --role-name AmazonEC2SpotFleetTaggingRole \
>     --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Sid":"","Effect":"Allow","Principal":{"Service":"spotfleet.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
{
    "Role": {
        "Path": "/",
        "RoleName": "AmazonEC2SpotFleetTaggingRole",
        "RoleId": "AROAQ4BT4DHFPKVBPBXGL",
        "Arn": "arn:aws:iam::123456789012:role/AmazonEC2SpotFleetTaggingRole",
        "CreateDate": "2022-04-01T01:55:29+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "spotfleet.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}

# マネージドIAMポリシーを作成したIAMロールにアタッチ
$ aws iam attach-role-policy \
>     --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole \
>     --role-name AmazonEC2SpotFleetTaggingRole

サービスリンクロールは作成済みでした。

# Amazon EC2 Spot の IAMサービスリンクロール作成
$ aws iam create-service-linked-role --aws-service-name spot.amazonaws.com

An error occurred (InvalidInput) when calling the CreateServiceLinkedRole operation: Service role name AWSServiceRoleForEC2Spot has been taken in this account, please try a different suffix.

# Amazon EC2 Spot Fleet の IAMサービスリンクロール作成
$ aws iam create-service-linked-role --aws-service-name spotfleet.amazonaws.com

An error occurred (InvalidInput) when calling the CreateServiceLinkedRole operation: Service role name AWSServiceRoleForEC2SpotFleet has been taken in this account, please try a different suffix.

私の環境の場合、最終的な成果物はAmazonEC2SpotFleetTaggingRoleIAMロールを1つ新規作成した状態です。

コンピューティング環境を新規作成

コンピューティング環境は新規作成します。今回作成した IAMロールをスポットフリートロールに指定してください。

以上の対応でジョブを実行すると今回のエラー(SpotFleetRequestConfig.IamFleetRole is invalid.)は解消されるはずです。

既存のコンピューティング環境の設定変更だと

既存のコンピューティング環境のスポットフリートロールは変更できません。と書いてあります。

注意 : 新しいコンピューティング環境を作成するには、新しいスポットフリートロールを使用します。既存のコンピューティング環境ではスポットフリートのロールを変更できません。古い環境を取り除くには、その環境を非アクティブ化してから削除します。

引用: AWS Batch で有効でないコンピューティング環境を修正する

既存コンピューティング環境の編集ボタンをクリックすると、配分戦略はグレーアウトされていますがスポットフリートロールは変更できそうな感じします。

スポットフリートロールの IAMロールを変更し更新しUPDATINGと表示されました。

ですが、既存コンピューティング環境を再度確認すると設定が反映されていません。やはりコンピューティング環境は新規作成するしかないようです。

おわりに

既存コンピューティング環境変更しても修正できそうと思って試したのですがダメでした。諦めて最初からコンピューティング環境は新規に作成してください。でないと、私みたいに無駄に時間かかってしまいます。どなたかのお役に立てれば幸いです。