AWS ParallelCluster で "Unexpected error when getting S3 bucket: Forbidden" が出力される原因と解決方法
はじめに
AWS ParallelCluster でクラスターを作成・更新する際に表示される以下のメッセージの原因と解決方法を説明します。
{
"level": "WARNING",
"type": "AsyncTimedUrlValidator",
"message": "Unexpected error when getting S3 bucket '[YOUR_BUCKET_NAME]': 'Forbidden'"
}
原因
このエラーはpcluster
コマンドを実行する環境がカスタムブートストラップスクリプトを含む S3 バケットに対して必要な権限(IAM ポリシー)が不足しているときに発生します。
以下のようなクラスター設定ファイルを例に説明します。コンピュートノードの設定を例にしていますがヘッドノードも同様です。
Scheduling:
SlurmQueues:
- Name: compute
ComputeSettings:
LocalStorage:
RootVolume:
Size: 35
Iam:
S3Access: # コンピュートノードに付与されるS3バケットのアクセス権限
- BucketName: [YOUR_BUCKET_NAME]
EnableWriteAccess: false
CustomActions: # カスタムブートストラップスクリプトの設定
OnNodeConfigured:
Sequence:
- Script: s3://[YOUR_BUCKET_NAME]/scripts/install.sh # ここで指定したS3バケットへのアクセス権限が必要
S3Access
セクションでコンピュートノードにはバケットへのアクセス権限が付与されます。pcluster
コマンドの実行環境には自動で権限は付与されません。権限不足のままだと「Forbidden」が出るため、事前に必要な権限を設定しておくとエラーを回避できます。
影響度について
実際にブートストラップスクリプトを利用する各ノードに権限が与えられていればクラスター自体の動作に支障はありません。しかし、pcluster
コマンドの実行環境でバケット検証時にエラーを避けるためにも権限付与が望ましいです。
S3 バケットへの権限自動付与について
クラスターの作成・更新時に必要となる IAM ポリシーを自動的に作成し、各ノードへ付与するにはあらかじめ IAM 関連の権限を用意しておく必要があります。
最新の情報は該当のドキュメントをご参照ください。
以下の記事では IAM 関連の設定を含めた権限の設定方法を紹介しています。
解決方法
pcluster
コマンドを実行する環境に対して、カスタムブートストラップスクリプト用の S3 バケットへのアクセス権限を付与します。
pcluster コマンドを実行する環境用に必要な IAMポリシー 作成
以下の内容で新しい IAM ポリシーを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::[YOUR_BUCKET_NAME]",
"arn:aws:s3:::[YOUR_BUCKET_NAME]/*"
],
"Effect": "Allow",
"Sid": "S3Read"
}
]
}
コンピュートノード向けに自動作成された IAM ポリシーを流用しています。
IAM ロールへ 新規作成の IAM ポリシーをアタッチ
作成したポリシーをpcluster
コマンドを実行する環境の IAM ロールにアタッチします。
権限の確認
以下のコマンドでクラスターの作成、更新時に同じワーニングのメッセージが出力されないことを確認します。
# クラスター作成時の例
pcluster create-cluster -n ${CLUSTER_NAME} -c ./config.yaml --dryrun true
# クラスター更新時の例
pcluster update-cluster -n ${CLUSTER_NAME} -c ./config.yaml --dryrun true
まとめ
- カスタムブートストラップスクリプトを使用する場合、そのスクリプトを格納した S3 バケットへのアクセス権限が必要です
pcluster
コマンドを実行する環境には手動で権限を付与する必要があります
おわりに
pcluster ベーシックユーザーポリシーの S3 の権限は以下の様になっていました。
parallelcluster-*
で始まるバケットにはフルアクセスaws-parallelcluster-*
で始まるバケットにもフルアクセス*-aws-parallelcluster*
で終わるバケットには読み取り専用アクセス
{
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::parallelcluster-*",
"arn:aws:s3:::aws-parallelcluster-*"
],
"Effect": "Allow",
"Sid": "S3ResourcesBucket"
},
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "arn:aws:s3:::*-aws-parallelcluster*",
"Effect": "Allow",
"Sid": "S3ParallelClusterReadOnly"
}
そう考えると、カスタムブートストラップ用の S3 バケットは、1-3 のパターンのどれかの命名規則で作成しておくと追加の権限設定を最小化できます。