AWS ParallelCluster ジョブをサブミット後にスポットインスタンスが起動してこない原因と対処方法 – サービスリンクロール未作成編

2023.12.27

AWS ParallelCluster のクラスター環境を作成して、はじめてジョブを投げたあとにコンピュートノードが起動してこなかった経験はないでしょうか?私は数えきれないほどあるのですが、AWS 特有の設定漏れによる凡ミスで失敗したときの事例を紹介します。

  • 新規に発行した AWS アカウント上で AWS ParallelCluster のクラスター環境を構築
  • ジョブをサブミットするとスポットインスタンスのコンピュートノードが起動しない
  • squeue コマンドから確認できるメッセージ
    • Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions

原因と対処方法早見

スポットインスタンス用のサービスリンクロールを未作成であればまずは作成してください。

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.

この場合は他の原因が考えられますので本記事では取り扱いません。ヘッドノードの/var/log/parallelcluster配下のログを確認するなどして切り分けを継続してください。

状況

新規発行の AWS アカウントに AWS ParallelCluster のクラスター環境を構築しました。

項目 バージョン
AWS ParallelCluster 3.8.0
OS Ubuntu 22.04 LTS
CPU Arch Intel(x86_64)
Head node t3.micro

ヘッドノードにログインし、スポットインスタンスを利用するパーティション(キュー)を指定してテストジョブをサブミットしました。待てども悲しいことにコンピュートノードが起動してきません。

切り分け

EC2 の起動状況

コンピュートノードの EC2 がまったく起動しないため、マネージメントコンソールの EC2 の画面からはヘッドノードの起動しか確認できません。

Slrum コマンドから確認

squeueコマンドで確認すると以下の結果でした。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                 1     test1  test.sh   ubuntu PD       0:00      1 (Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions)

Slurm のログ確認

ヘッドノードから Slurm のログを確認します。

パス: /var/log/parallelcluster/slurm_resume.log

以下のメッセージを確認しました。スポットインスタンス用のサービスリンクロールが必要とのことです。

2023-12-27 04:54:59,429 - 1997 - [slurm_plugin.fleet_manager:_launch_instances] - ERROR - JobID 1 - Error in CreateFleet request (ecd7c2d6-f8ab-47ac-a5ba-8839ff546b47): AuthFailure.ServiceLinkedRoleCreationNotPermitted - The provided credentials do not have permission to create the service-linked role for EC2 Spot Instances.

CloudTrail のログ確認

ジョブをサブミットした時間帯に以下のイベントを確認しました。errMessageに Slurm で確認したメッセージと同じメッセージを確認できました。

項目
イベント名 RunInstances
イベントソース ec2.amazonaws.com
エラーコード Client.AuthFailure.ServiceLinkedRoleCreationNotPermitted
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROATXZ233RSPURJZWO2J:i-0e7dec03d739b8301",
        "arn": "arn:aws:sts::123456798012:assumed-role/v380-RoleHeadNode-SAjUEgcnuI2G/i-0e7dec03d739b8301",
        "accountId": "123456798012",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROATXZ233RSPURJZWO2J",
                "arn": "arn:aws:iam::123456798012:role/parallelcluster/v380/v380-RoleHeadNode-SAjUEgcnuI2G",
                "accountId": "123456798012",
                "userName": "v380-RoleHeadNode-SAjUEgcnuI2G"
            },
            "attributes": {
                "creationDate": "2023-12-27T04:43:07Z",
                "mfaAuthenticated": "false"
            },
            "ec2RoleDelivery": "2.0"
        },
        "invokedBy": "ec2fleet.amazonaws.com"
    },
    "eventTime": "2023-12-27T05:09:26Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "RunInstances",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "ec2fleet.amazonaws.com",
    "userAgent": "ec2fleet.amazonaws.com",
    "errorCode": "Client.AuthFailure.ServiceLinkedRoleCreationNotPermitted",
    "errorMessage": "The provided credentials do not have permission to create the service-linked role for EC2 Spot Instances.",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "minCount": 1,
                    "maxCount": 1
                }
            ]
        },
        "instanceType": "t3a.micro",
        "blockDeviceMapping": {},
        "availabilityZone": "ap-northeast-1a",
        "monitoring": {
            "enabled": false
        },
        "disableApiTermination": false,
        "disableApiStop": false,
        "clientToken": "fleet-c6063fa5-7116-c13e-24b2-2ea8eaa72aff-4",
        "networkInterfaceSet": {
            "items": [
                {
                    "deviceIndex": 0,
                    "subnetId": "subnet-0c82bb28e119e2aa8"
                }
            ]
        },
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "instance",
                    "tags": [
                        {
                            "key": "aws:ec2:fleet-id",
                            "value": "fleet-c6063fa5-7116-c13e-24b2-2ea8eaa72aff"
                        }
                    ]
                }
            ]
        },
        "launchTemplate": {
            "launchTemplateId": "lt-0c3ad908cd3b624f5",
            "version": "1"
        },
        "instanceMarketOptions": {
            "marketType": "spot",
            "spotOptions": {
                "spotInstanceType": "one-time"
            }
        }
    },
    "responseElements": null,
    "requestID": "629366f7-f9f6-4aca-ad69-9674d9adf35b",
    "eventID": "a60fe5ca-1643-4c20-b421-99b5e64e456f",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456798012",
    "eventCategory": "Management"
}

原因と対処方法

原因

スポットインスタンスを起動に必要なサービスリンクロールが作成されていない。

コンピュートノードをスポットインスタンスで起動するように設定している場合に発生します。

以下は今回のエラーになったクラスターを作成元の ParallelCluster のコンフィグファイルからコンピュートノードの設定箇所の抜粋です。

Scheduling:
  Scheduler: slurm
  SlurmSettings:
    ScaledownIdletime: 5
  SlurmQueues:
    # ------ Test 1 ------
    - Name: test1
      ComputeResources:
        - Name: test1
          Instances:
            - InstanceType: t3.micro
            - InstanceType: t3a.micro
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 40
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT # ← スポットインスタンスを指定している場合
      AllocationStrategy: capacity-optimized
      Networking:
        SubnetIds:
          - subnet-0c82bb28e119e2aa8
          - subnet-0296a0c8515ed3bdc
          - subnet-0089ff187d1f54258
        PlacementGroup:
          Enabled: false

新規アカウントの場合は必要なサービスリンクロールの作成を忘れがちです。

対処

スポットインスタンスの起動に必要なサービスリンクロールを作成します。

aws iam create-service-linked-role --aws-service-name spot.amazonaws.com

対処方法は Parallelcluster のスケーリングに関するトラブルシューティングガイドに載っています。

Compute nodes backed by Spot Instances:

Troubleshooting scaling issues - AWS ParallelCluster

サービスリンクロールを作成してみる

スポットインスタンス用のサービスリンクロールを作成コマンドを実行します。

$ aws iam create-service-linked-role --aws-service-name spot.amazonaws.com

サービスリンクロールがなかった場合は以下のロール作成しましたメッセージが返ってきます。このメッセージが返ってきたということは、サービスリンクロールがなかったことが原因でスポットインスタンスのコンピュートノードが起動できなかったことは間違いないです。ですが、他にも問題があってコンピュートノードが引き続き起動できない可能性はあります。

{
    "Role": {
        "Path": "/aws-service-role/spot.amazonaws.com/",
        "RoleName": "AWSServiceRoleForEC2Spot",
        "RoleId": "AROATXZ233RSHO3XI5BCD",
        "Arn": "arn:aws:iam::123456798012:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot",
        "CreateDate": "2023-12-27T06:23:28+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": [
                        "sts:AssumeRole"
                    ],
                    "Effect": "Allow",
                    "Principal": {
                        "Service": [
                            "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.

サービスリンクロールを作成後、コンピュートノード(EC2)が起動するようになったがすぐに終了してしまう場合

経験上、コンピュートノードの起動時に設定を入れ込むカスタムブートストラップ処理(旧 post install 処理)のスクリプトに問題があって起動に失敗する可能性が高いです。

私の場合はトラブル原因の 7 割はここです。切り分け方法としてはカスタムブートストラップ処理の箇所をコメントアウトしてクラスターの更新をかけると良いです。

#      CustomActions:
#        OnNodeConfigured:
#          Script: s3://hpc-dev-custom-boostrap-files-for-parallelcluster/install/apptainer.sh

おわりに

久々に新規アカウント上に ParallelCluster を構築していて、すっかりサービスリンクロールの存在を忘れていました。 新規の AWS アカウントのあるあるなのですが、ParallelCluster からスポットインスタンスを起動すると確認に必要なログがどこにあるか初見だとたどり着きにくいため書き残しました。よきスポットインスタンスライフを願っております。