AWS ParallelCluster 3.x のクラスター作成・管理する EC2 に必要な IAM ロール作成手順

AWS ParallelCluster 3.x のクラスター作成・管理する EC2 に必要な IAM ロール作成手順

Clock Icon2024.11.30

AWS ParallelCluster のクラスター管理には、適切な IAM ロールが必要です。この記事ではクラスター管理用 EC2 インスタンスに必要な IAM ロール作成手順を説明します。

Blog

この手順で作成する IAM ロールにより以下が可能になります。

  • pclusterコマンドを使用した AWS ParallelCluster のクラスター管理
  • Systems Manager のセッションマネージャーを使用したインスタンス接続

作成手順の概要

以下をマネージメントコンソールから手作業で作成します。

  1. IAM ポリシーの作成
  2. IAM ロールの作成
  3. EC2 インスタンスへの IAM ロール適用

IAM ポリシーの作成

公式の pcluster user policy をベースにポリシーを作成します。

Base AWS ParallelCluster pcluster user policy
AWS Identity and Access Management permissions in AWS ParallelCluster - AWS ParallelCluster

IAM ポリシーを作成します。

ポリシー___IAM___Global

ポリシーエディタで JSON を選択し、以下のポリシーをコピー&ペーストします。

ポリシーの作成___IAM___Global-4

v3.11.1
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "EC2Read"
        },
        {
            "Action": [
                "ec2:AllocateAddress",
                "ec2:AssociateAddress",
                "ec2:AttachNetworkInterface",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CreateFleet",
                "ec2:CreateLaunchTemplate",
                "ec2:CreateLaunchTemplateVersion",
                "ec2:CreateNetworkInterface",
                "ec2:CreatePlacementGroup",
                "ec2:CreateSecurityGroup",
                "ec2:CreateSnapshot",
                "ec2:CreateTags",
                "ec2:DeleteTags",
                "ec2:CreateVolume",
                "ec2:DeleteLaunchTemplate",
                "ec2:DeleteNetworkInterface",
                "ec2:DeletePlacementGroup",
                "ec2:DeleteSecurityGroup",
                "ec2:DeleteVolume",
                "ec2:DisassociateAddress",
                "ec2:ModifyLaunchTemplate",
                "ec2:ModifyNetworkInterfaceAttribute",
                "ec2:ModifyVolume",
                "ec2:ModifyVolumeAttribute",
                "ec2:ReleaseAddress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:RunInstances",
                "ec2:TerminateInstances"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "EC2Write"
        },
        {
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:ListTagsOfResource",
                "dynamodb:CreateTable",
                "dynamodb:DeleteTable",
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:Query",
                "dynamodb:TagResource"
            ],
            "Resource": "arn:aws:dynamodb:*:[YOUR_ACCOUNT_ID]:table/parallelcluster-*",
            "Effect": "Allow",
            "Sid": "DynamoDB"
        },
        {
            "Action": [
                "route53:ChangeResourceRecordSets",
                "route53:ChangeTagsForResource",
                "route53:CreateHostedZone",
                "route53:DeleteHostedZone",
                "route53:GetChange",
                "route53:GetHostedZone",
                "route53:ListResourceRecordSets",
                "route53:ListQueryLoggingConfigs"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "Route53HostedZones"
        },
        {
            "Action": [
                "cloudformation:*"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "CloudFormation"
        },
        {
            "Action": [
                "cloudwatch:PutDashboard",
                "cloudwatch:ListDashboards",
                "cloudwatch:DeleteDashboards",
                "cloudwatch:GetDashboard",
                "cloudwatch:PutMetricAlarm",
                "cloudwatch:DeleteAlarms",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:PutCompositeAlarm"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "CloudWatch"
        },
        {
            "Action": [
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:GetPolicy",
                "iam:SimulatePrincipalPolicy",
                "iam:GetInstanceProfile"
            ],
            "Resource": [
                "arn:aws:iam::[YOUR_ACCOUNT_ID]:role/*",
                "arn:aws:iam::[YOUR_ACCOUNT_ID]:policy/*",
                "arn:aws:iam::aws:policy/*",
                "arn:aws:iam::[YOUR_ACCOUNT_ID]:instance-profile/*"
            ],
            "Effect": "Allow",
            "Sid": "IamRead"
        },
        {
            "Action": [
                "iam:CreateInstanceProfile",
                "iam:DeleteInstanceProfile",
                "iam:AddRoleToInstanceProfile",
                "iam:RemoveRoleFromInstanceProfile"
            ],
            "Resource": [
                "arn:aws:iam::[YOUR_ACCOUNT_ID]:instance-profile/parallelcluster/*"
            ],
            "Effect": "Allow",
            "Sid": "IamInstanceProfile"
        },
        {
            "Condition": {
                "StringEqualsIfExists": {
                    "iam:PassedToService": [
                        "lambda.amazonaws.com",
                        "ec2.amazonaws.com",
                        "spotfleet.amazonaws.com"
                    ]
                }
            },
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::[YOUR_ACCOUNT_ID]:role/parallelcluster/*"
            ],
            "Effect": "Allow",
            "Sid": "IamPassRole"
        },
        {
            "Action": [
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:GetFunctionConfiguration",
                "lambda:GetFunction",
                "lambda:InvokeFunction",
                "lambda:AddPermission",
                "lambda:RemovePermission",
                "lambda:UpdateFunctionConfiguration",
                "lambda:TagResource",
                "lambda:ListTags",
                "lambda:UntagResource"
            ],
            "Resource": [
                "arn:aws:lambda:*:[YOUR_ACCOUNT_ID]:function:parallelcluster-*",
                "arn:aws:lambda:*:[YOUR_ACCOUNT_ID]:function:pcluster-*"
            ],
            "Effect": "Allow",
            "Sid": "Lambda"
        },
        {
            "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"
        },
        {
            "Action": [
                "elasticfilesystem:*"
            ],
            "Resource": [
                "arn:aws:elasticfilesystem:*:[YOUR_ACCOUNT_ID]:*"
            ],
            "Effect": "Allow",
            "Sid": "EFS"
        },
        {
            "Action": [
                "logs:DeleteLogGroup",
                "logs:PutRetentionPolicy",
                "logs:DescribeLogGroups",
                "logs:CreateLogGroup",
                "logs:TagResource",
                "logs:UntagResource",
                "logs:FilterLogEvents",
                "logs:GetLogEvents",
                "logs:CreateExportTask",
                "logs:DescribeLogStreams",
                "logs:DescribeExportTasks",
                "logs:DescribeMetricFilters",
                "logs:PutMetricFilter",
                "logs:DeleteMetricFilter"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "CloudWatchLogs"
        },
        {
            "Action": [
                "resource-groups:ListGroupResources"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "ResourceGroupRead"
        },
        {
            "Sid": "AllowDescribingFileCache",
            "Effect": "Allow",
            "Action": [
                "fsx:DescribeFileCaches"
            ],
            "Resource": "*"
        },
        {
            "Action": "secretsmanager:DescribeSecret",
            "Resource": "arn:aws:secretsmanager:*:[YOUR_ACCOUNT_ID]:secret:*",
            "Effect": "Allow"
        }
    ]
}

ポリシー名を PclusterUserPolicy として設定します。

ポリシーの作成___IAM___Global-5

IAM ロールの作成

EC2 用の IAM ロールを作成し、必要なポリシーをアタッチします。

ロール___IAM___Global

EC2 のユースケースを選択します。

ロールを作成___IAM___Global-2

作成したカスタムポリシー PclusterUserPolicy をアタッチします。

ロールを作成___IAM___Global-3

AmazonSSMManagedInstanceCore ポリシーは Systems Manager での接続に必要です。
ParallelCluster の管理には必須ではありません。

ロールを作成___IAM___Global-4

ロール名を PculsuterUserRole として設定します。

ロールを作成___IAM___Global-5

EC2 インスタンスへの適用

作成した IAM ロールを管理用 EC2 インスタンスに適用します。

インスタンス___EC2___ap-northeast-1-16

IAM ロールをアタッチします。

IAM_ロールを変更___EC2___ap-northeast-1

これで pcluster コマンドを使用したクラスター管理が可能になります。コマンドインストール方法は以下のドキュメントを参考にしてください。

Install AWS ParallelCluster in a virtual environment (recommended) - AWS ParallelCluster

おわりに

直近で 2 回お客様へ案内することがあったため作業手順をまとめました。IAM ポリシーの作成はやや手間ですが、それ以外は一般的なお作法です。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.