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 からスポットインスタンスを起動すると確認に必要なログがどこにあるか初見だとたどり着きにくいため書き残しました。よきスポットインスタンスライフを願っております。