Active Directory の統合 - AWS ParallelCluster

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Active Directory の統合

このチュートリアルでは、マルチユーザー環境を作成します。この環境には、corp.example.com にある AWS Managed Microsoft AD (Active Directory) と統合された AWS ParallelCluster が含まれています。ディレクトリを管理する Admin ユーザー、ディレクトリを読み取る ReadOnly ユーザー、クラスターにログインする user000 ユーザーを設定します。自動パスまたは手動パスのいずれかを使用して、AD の設定に使用するネットワークリソース、Active Directory (AD)、EC2 インスタンスを作成できます。いずれのパスを使用する場合でも、作成するインフラストラクチャは、以下の方法のいずれかを使用して AWS ParallelCluster を統合するように事前設定済みです。

  • 証明書の検証付き LDAPS (最も安全なオプションとして推奨)

  • 証明書の検証なしの LDAPS

  • LDAP

LDAP 自体は暗号化を提供しません。機密である可能性の高い情報を安全に送信するために、AD と統合されたクラスターには LDAPS (TLS/SSL 経由の LDAP) を使用することを強くお勧めします。詳細については、「AWS Directory Service 管理ガイド」の「AWS Managed Microsoft AD を使用してサーバー側の LDAPS を有効にする」を参照してください。

これらのリソースを作成したら、Active Directory (AD) と統合されたクラスターの設定と作成に進みます。クラスターが作成されたら、作成したユーザーでログインします。このチュートリアルで作成する設定の詳細については、「クラスターへの複数のユーザーアクセス」と「DirectoryService 設定」セクションを参照してください。

このチュートリアルでは、クラスターへの複数のユーザーアクセスをサポートする環境を作成する方法について説明します。このチュートリアルでは、AWS Directory Service AD の作成方法と使用方法については説明していません。このチュートリアルで AWS Managed Microsoft AD を設定する手順は、テスト目的でのみ提供されています。これらは、「AWS Directory Service 管理ガイド」の「AWS Managed Microsoft AD」および「Simple Active Directory」に記載されている公式ドキュメントやベストプラクティスに代わるものではありません

注記

ディレクトリユーザーのパスワードは、ディレクトリパスワードポリシーのプロパティ定義に従って有効期限が切れます。詳細については、「サポートされているポリシー設定」を参照してください。AWS ParallelCluster でディレクトリパスワードをリセットするには、「ユーザーパスワードと失効しているパスワードをリセットする方法」を参照してください。

注記

ディレクトリのドメインコントローラーの IP アドレスは、ドメインコントローラーの変更やディレクトリのメンテナンスにより変わる可能性があります。自動クイック作成方法を選択して、ディレクトリインフラストラクチャを作成した場合、ディレクトリ IP アドレスが変更されると、ロードバランサーをディレクトリコントローラーの前に手動で配置する必要があります。クイック作成方法を使用する場合、ディレクトリ IP アドレスはロードバランサーと自動的に調整されません。

AWS ParallelCluster コマンドラインインターフェイス (CLI) または API を使用する場合、AWS ParallelCluster イメージとクラスターを作成または更新するときに作成された AWS リソースに対してのみ支払いが発生します。詳細については、「AWS ParallelCluster で使用されるサービス AWS」を参照してください。

AWS ParallelCluster UI はサーバーレスアーキテクチャに基づいて構築されており、ほとんどの場合、AWS 無料利用枠のカテゴリ内で使用できます。詳細については、「AWS ParallelCluster UI コスト」を参照してください。

前提条件

チュートリアルを進めながら、region-idd-abcdef01234567890 など、inputs highlighted in red を自分の名前と ID に置き換えてます。0123456789012 を AWS アカウント 番号に置き換えます。

[自動] タブを選択し、AWS CloudFormation クイック作成テンプレートを使用して Active Directory (AD) インフラストラクチャを作成します。

[手動] タブを選択し、AD インフラストラクチャを手動で作成します。

  1. AWS Management Consoleにサインインします。

  2. CloudFormation クイック作成 (リージョン us-east-1) を開いて、コンソールに次のリソースを作成します。 CloudFormation

    • 2 つのサブネットとパブリックアクセス用のルーティングを持つ VPC (VPC が指定されていない場合)。

    • AWS Managed Microsoft AD。

    • ディレクトリの管理に使用できる、AD に接続されている EC2 インスタンス。

  3. [スタックのクイック作成] ページの [パラメータ] セクションで、以下のパラメータのパスワードを入力します。

    • AdminPassword

    • ReadOnlyPassword

    • UserPassword

    パスワードを書き留めます。これらは、このチュートリアルで後ほど使用します。

  4. [DomainName] に「corp.example.com」と入力します。

  5. [Keypair] には、EC2 キーペアの名前を入力します。

  6. ページの下部で、チェックボックスを選択し、各アクセス機能を確認します。

  7. [スタックの作成] を選択します。

  8. CloudFormation CREATE_COMPLETEスタックがその状態になったら、スタックの Outputs タブを選択します。出力リソース名と ID は後のステップで使用する必要があるため、書き留めます。出力には、クラスターの作成に必要な情報が用意されています。

    AWS Management Console で作成されたスタック出力を示す図。
  9. (オプション) ステップ 2: AD ユーザーとグループの管理 の演習を完了するには、ディレクトリ ID が必要です。[リソース] を選択し、下にスクロールして、ディレクトリ ID を書き留めます。

  10. (オプション) ステップ 2: AD ユーザーとグループの管理 または ステップ 3: クラスターの作成 に進みます。

異なるアベイラビリティゾーンにある 2 つのサブネットと、 AWS Managed Microsoft AD を使用して、ディレクトリサービス用の VPC を作成します。

注記
  • ディレクトリとドメイン名は corp.example.com です。省略名は CORP です。

  • スクリプト内の Admin パスワードを変更します。

  • Active Directory (AD) の作成には少なくとも 15 分かかります。

次の Python スクリプトを使用して、ローカル AWS リージョン に VPC、サブネット、AD リソースを作成します。このファイルを ad.py として保存し、実行します。

import boto3 import time from pprint import pprint vpc_name = "PclusterVPC" ad_domain = "corp.example.com" admin_password = "asdfASDF1234" ec2 = boto3.client("ec2") ds = boto3.client("ds") region = boto3.Session().region_name # Create the VPC, Subnets, IGW, Routes vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"] vpc_id = vpc["VpcId"] time.sleep(30) ec2.create_tags(Resources=[vpc_id], Tags=[{"Key": "Name", "Value": vpc_name}]) subnet1 = ec2.create_subnet(VpcId=vpc_id, CidrBlock="10.0.0.0/17", AvailabilityZone=f"{region}a")["Subnet"] subnet1_id = subnet1["SubnetId"] time.sleep(30) ec2.create_tags(Resources=[subnet1_id], Tags=[{"Key": "Name", "Value": f"{vpc_name}/subnet1"}]) ec2.modify_subnet_attribute(SubnetId=subnet1_id, MapPublicIpOnLaunch={"Value": True}) subnet2 = ec2.create_subnet(VpcId=vpc_id, CidrBlock="10.0.128.0/17", AvailabilityZone=f"{region}b")["Subnet"] subnet2_id = subnet2["SubnetId"] time.sleep(30) ec2.create_tags(Resources=[subnet2_id], Tags=[{"Key": "Name", "Value": f"{vpc_name}/subnet2"}]) ec2.modify_subnet_attribute(SubnetId=subnet2_id, MapPublicIpOnLaunch={"Value": True}) igw = ec2.create_internet_gateway()["InternetGateway"] ec2.attach_internet_gateway(InternetGatewayId=igw["InternetGatewayId"], VpcId=vpc_id) route_table = ec2.describe_route_tables(Filters=[{"Name": "vpc-id", "Values": [vpc_id]}])["RouteTables"][0] ec2.create_route(RouteTableId=route_table["RouteTableId"], DestinationCidrBlock="0.0.0.0/0", GatewayId=igw["InternetGatewayId"]) ec2.modify_vpc_attribute(VpcId=vpc_id, EnableDnsSupport={"Value": True}) ec2.modify_vpc_attribute(VpcId=vpc_id, EnableDnsHostnames={"Value": True}) # Create the Active Directory ad = ds.create_microsoft_ad( Name=ad_domain, Password=admin_password, Description="ParallelCluster AD", VpcSettings={"VpcId": vpc_id, "SubnetIds": [subnet1_id, subnet2_id]}, Edition="Standard", ) directory_id = ad["DirectoryId"] # Wait for completion print("Waiting for the directory to be created...") directories = ds.describe_directories(DirectoryIds=[directory_id])["DirectoryDescriptions"] directory = directories[0] while directory["Stage"] in {"Requested", "Creating"}: time.sleep(3) directories = ds.describe_directories(DirectoryIds=[directory_id])["DirectoryDescriptions"] directory = directories[0] dns_ip_addrs = directory["DnsIpAddrs"] pprint({"directory_id": directory_id, "vpc_id": vpc_id, "subnet1_id": subnet1_id, "subnet2_id": subnet2_id, "dns_ip_addrs": dns_ip_addrs})

Python スクリプトからの出力例を次に示します。

{ "directory_id": "d-abcdef01234567890", "dns_ip_addrs": ["192.0.2.254", "203.0.113.237"], "subnet1_id": "subnet-021345abcdef6789", "subnet2_id": "subnet-1234567890abcdef0", "vpc_id": "vpc-021345abcdef6789" }

出力リソース名と ID を書き留めます。これらは、後のステップで使用します。

スクリプトが完了したら、次のステップに進みます。

New EC2 console
  1. AWS Management Consoleにサインインします。

  2. ステップ 4 で記載されたポリシーがアタッチされているロールがない場合は、https://console.aws.amazon.com/iam/ で IAM コンソールを開きます。それ以外の場合は、ステップ 5 に進みます。

  3. ResetUserPassword ポリシーを作成し、赤く強調表示されたコンテンツを、AD を作成するために実行したスクリプトの出力にある AWS リージョン ID、アカウント ID、ディレクトリ ID に置き換えます。

    ResetUserPassword

    { "Statement": [ { "Action": [ "ds:ResetUserPassword" ], "Resource": "arn:aws:ds:region-id:123456789012:directory/d-abcdef01234567890", "Effect": "Allow" } ] }
  4. 以下のポリシーがアタッチされた IAM ロールを作成します。

  5. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

  6. [EC2 ダッシュボード] で、[インスタンスを起動] を選択します。

  7. [アプリケーションイメージと OS イメージ] で、最近の Amazon Linux 2 AMI を選択します。

  8. [インスタンスタイプ] で [t2.micro] を選択します。

  9. [キーペア] で、キーペアを選択します。

  10. [ネットワーク設定] で、[編集] を選択します。

  11. [VPC] で、ディレクトリ VPC を選択します。

  12. 下にスクロールして [高度な詳細] を選択します。

  13. [高度な詳細][ドメイン結合ディレクトリ] で、corp.example.com を選択します。

  14. [IAM インスタンスプロファイル] で、ステップ 1 で作成したロール、またはステップ 4 でリストしたポリシーがアタッチされたロールを選択します。

  15. [概要][インスタンスを起動] を選択します。

  16. インスタンス ID (例:i-1234567890abcdef0) を書き留め、インスタンスの起動が完了するまで待ちます。

  17. インスタンスが起動したら、次のステップに進みます。

Old EC2 console
  1. AWS Management Consoleにサインインします。

  2. ステップ 4 で記載されたポリシーがアタッチされているロールがない場合は、https://console.aws.amazon.com/iam/ で IAM コンソールを開きます。それ以外の場合は、ステップ 5 に進みます。

  3. ResetUserPassword ポリシーを作成します。赤く強調表示されたコンテンツを、Active Directory (AD) を作成するために実行したスクリプトの出力にある AWS リージョン ID、AWS アカウント ID、ディレクトリ ID に置き換えます。

    ResetUserPassword

    { "Statement": [ { "Action": [ "ds:ResetUserPassword" ], "Resource": "arn:aws:ds:region-id:123456789012:directory/d-abcdef01234567890", "Effect": "Allow" } ] }
  4. 以下のポリシーがアタッチされた IAM ロールを作成します。

  5. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

  6. [EC2 ダッシュボード] で、[インスタンスを起動] を選択します。

  7. [アプリケーションイメージと OS イメージ] で、最近の Amazon Linux 2 AMI を選択します。

  8. [Instance type (インスタンスタイプ)] として [t2.micro] を選択します。

  9. [キーペア] で、キーペアを選択します。

  10. [ネットワーク設定] で、[編集] を選択します。

  11. [ネットワーク設定][VPC] で、ディレクトリ VPC を選択します。

  12. 下にスクロールして [高度な詳細] を選択します。

  13. [高度な詳細][ドメイン結合ディレクトリ] で、corp.example.com を選択します。

  14. [高度な詳細][インスタンスプロファイル] で、ステップ 1 で作成したロール、またはステップ 4 で記載されたポリシーがアタッチされているロールを選択します。

  15. [概要][インスタンスを起動] を選択します。

  16. インスタンス ID (例: i-1234567890abcdef0) を書き留め、インスタンスの起動が完了するまで待ちます。

  17. インスタンスが起動したら、次のステップに進みます。

  1. インスタンスに接続し、admin として AD 領域に結合します。

    次のコマンドを実行して、インスタンスに接続します。

    $ INSTANCE_ID="i-1234567890abcdef0"
    $ PUBLIC_IP=$(aws ec2 describe-instances \ --instance-ids $INSTANCE_ID \ --query "Reservations[0].Instances[0].PublicIpAddress" \ --output text)
    $ ssh -i ~/.ssh/keys/keypair.pem ec2-user@$PUBLIC_IP
  2. 必要なソフトウェアをインストールし、領域に結合します。
    $ sudo yum -y install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python
  3. 管理者パスワードを admin パスワードに置き換えます。
    $ ADMIN_PW="asdfASDF1234"
    $ echo $ADMIN_PW | sudo realm join -U Admin corp.example.com Password for Admin:

    上記が成功した場合は、領域に結合したので、次のステップに進むことができます。

  1. ReadOnlyUser と追加のユーザーを作成します。

    このステップでは、前のステップでインストールした adcli ツールと openldap-clients ツールを使用します。

    $ echo $ADMIN_PW | adcli create-user -x -U Admin --domain=corp.example.com --display-name=ReadOnlyUser ReadOnlyUser
    $ echo $ADMIN_PW | adcli create-user -x -U Admin --domain=corp.example.com --display-name=user000 user000
  2. ユーザーが作成されていることを確認します。

    ディレクトリの DNS IP アドレスは Python スクリプトの出力です。

    $ DIRECTORY_IP="192.0.2.254"
    $ ldapsearch -x -h $DIRECTORY_IP -D Admin -w $ADMIN_PW -b "cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com"
    $ ldapsearch -x -h $DIRECTORY_IP -D Admin -w $ADMIN_PW -b "cn=user000,ou=Users,ou=CORP,dc=corp,dc=example,dc=com"

    デフォルトでは、ad-cli を使用してユーザーを作成すると、そのユーザーは無効になります。

  3. ローカルマシンからユーザーパスワードをリセットおよび有効化します。

    EC2 インスタンスからログアウトします。

    注記
    • ro-p@ssw0rd は AWS Secrets Manager から取得した ReadOnlyUser のパスワードです。

    • user-p@ssw0rd はクラスターに接続 (ssh) するときに指定されるクラスターユーザーのパスワードです。

    directory-id は Python スクリプトの出力です。

    $ DIRECTORY_ID="d-abcdef01234567890"
    $ aws ds reset-user-password \ --directory-id $DIRECTORY_ID \ --user-name "ReadOnlyUser" \ --new-password "ro-p@ssw0rd" \ --region "region-id"
    $ aws ds reset-user-password \ --directory-id $DIRECTORY_ID \ --user-name "user000" \ --new-password "user-p@ssw0rd" \ --region "region-id"
  4. Secrets Manager シークレットにパスワードを追加します。

    ReadOnlyUser を作成してパスワードを設定したので、AWS ParallelCluster がログインの検証に使用するシークレットに保存します。

    Secrets Manager を使用して、ReadOnlyUser のパスワードを値として保持する新しいシークレットを作成します。シークレット値の形式はプレーンテキストのみである必要があります (JSON 形式ではない)。今後のステップに備えて、シークレットの ARN を書き留めておきます。

    $ aws secretsmanager create-secret --name "ADSecretPassword" \ --region region_id \ --secret-string "ro-p@ssw0rd" \ --query ARN \ --output text arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234

リソース ID を書き留めます。これらは、後のステップで使用します。

  1. ドメイン証明書をローカルで生成します。
    $ PRIVATE_KEY="corp-example-com.key" CERTIFICATE="corp-example-com.crt" printf ".\n.\n.\n.\n.\ncorp.example.com\n.\n" | openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout $PRIVATE_KEY -days 365 -out $CERTIFICATE
  2. 証明書を Secrets Manager に保存して、後でクラスター内から取得できるようにします。
    $ aws secretsmanager create-secret --name example-cert \ --secret-string file://$CERTIFICATE \ --region region-id { "ARN": "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", "Name": "example-cert", "VersionId": "14866070-092a-4d5a-bcdd-9219d0566b9c" }
  3. EC2 インスタンスを AD ドメインに結合するために作成した IAM ロールに、次のポリシーを追加します。

    PutDomainCertificateSecrets

    { "Statement": [ { "Action": [ "secretsmanager:PutSecretValue" ], "Resource": [ "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", ], "Effect": "Allow" } ] }
  4. 証明書を AWS Certificate Manager (ACM) にインポートします。
    $ aws acm import-certificate --certificate fileb://$CERTIFICATE \ --private-key fileb://$PRIVATE_KEY \ --region region-id { "CertificateArn": "arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72" }
  5. Active Directory エンドポイントの前に配置するロードバランサーを作成します。
    $ aws elbv2 create-load-balancer --name CorpExampleCom-NLB \ --type network \ --scheme internal \ --subnets subnet-1234567890abcdef0 subnet-021345abcdef6789 \ --region region-id { "LoadBalancers": [ { "LoadBalancerArn": "arn:aws:elasticloadbalancing:region-id:123456789012:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4", "DNSName": "CorpExampleCom-NLB-3afe296bf4ba80d4.elb.region-id.amazonaws.com", "CanonicalHostedZoneId": "Z2IFOLAFXWLO4F", "CreatedTime": "2022-05-05T12:56:55.988000+00:00", "LoadBalancerName": "CorpExampleCom-NLB", "Scheme": "internal", "VpcId": "vpc-021345abcdef6789", "State": { "Code": "provisioning" }, "Type": "network", "AvailabilityZones": [ { "ZoneName": "region-idb", "SubnetId": "subnet-021345abcdef6789", "LoadBalancerAddresses": [] }, { "ZoneName": "region-ida", "SubnetId": "subnet-1234567890abcdef0", "LoadBalancerAddresses": [] } ], "IpAddressType": "ipv4" } ] }
  6. Active Directory エンドポイントをターゲットとするターゲットグループを作成します。
    $ aws elbv2 create-target-group --name CorpExampleCom-Targets --protocol TCP \ --port 389 \ --target-type ip \ --vpc-id vpc-021345abcdef6789 \ --region region-id { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81", "TargetGroupName": "CorpExampleCom-Targets", "Protocol": "TCP", "Port": 389, "VpcId": "vpc-021345abcdef6789", "HealthCheckProtocol": "TCP", "HealthCheckPort": "traffic-port", "HealthCheckEnabled": true, "HealthCheckIntervalSeconds": 30, "HealthCheckTimeoutSeconds": 10, "HealthyThresholdCount": 3, "UnhealthyThresholdCount": 3, "TargetType": "ip", "IpAddressType": "ipv4" } ] }
  7. Active Directory (AD) エンドポイントをターゲットグループに登録します。
    $ aws elbv2 register-targets --target-group-arn arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81 \ --targets Id=192.0.2.254,Port=389 Id=203.0.113.237,Port=389 \ --region region-id
  8. 証明書を使用して LB リスナーを作成します。
    $ aws elbv2 create-listener --load-balancer-arn arn:aws:elasticloadbalancing:region-id:123456789012:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4 \ --protocol TLS \ --port 636 \ --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81 \ --ssl-policy ELBSecurityPolicy-TLS-1-2-2017-01 \ --certificates CertificateArn=arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72 \ --region region-id "Listeners": [ { "ListenerArn": "arn:aws:elasticloadbalancing:region-id:123456789012:listener/net/CorpExampleCom-NLB/3afe296bf4ba80d4/a8f9d97318743d4b", "LoadBalancerArn": "arn:aws:elasticloadbalancing:region-id:123456789012:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4", "Port": 636, "Protocol": "TLS", "Certificates": [ { "CertificateArn": "arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72" } ], "SslPolicy": "ELBSecurityPolicy-TLS-1-2-2017-01", "DefaultActions": [ { "Type": "forward", "TargetGroupArn": "arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81" } ] } } ] } ] }
  9. ホストゾーンを作成して、クラスター VPC 内でドメインを検出できるようにします。
    $ aws route53 create-hosted-zone --name corp.example.com \ --vpc VPCRegion=region-id,VPCId=vpc-021345abcdef6789 \ --caller-reference "ParallelCluster AD Tutorial" { "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z09020002B5MZQNXMSJUB", "HostedZone": { "Id": "/hostedzone/Z09020002B5MZQNXMSJUB", "Name": "corp.example.com.", "CallerReference": "ParallelCluster AD Tutorial", "Config": { "PrivateZone": true }, "ResourceRecordSetCount": 2 }, "ChangeInfo": { "Id": "/change/C05533343BF3IKSORW1TQ", "Status": "PENDING", "SubmittedAt": "2022-05-05T13:21:53.863000+00:00" }, "VPC": { "VPCRegion": "region-id", "VPCId": "vpc-021345abcdef6789" } }
  10. 次のコンテンツを使用して、recordset-change.json と言う名前のファイルを作成します。HostedZoneId はロードバランサーの正規のホストゾーン ID です。
    { "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": "corp.example.com", "Type": "A", "Region": "region-id", "SetIdentifier": "example-active-directory", "AliasTarget": { "HostedZoneId": "Z2IFOLAFXWLO4F", "DNSName": "CorpExampleCom-NLB-3afe296bf4ba80d4.elb.region-id.amazonaws.com", "EvaluateTargetHealth": true } } } ] }
  11. 今度はホストゾーン ID を使用して、レコードセットの変更をホストゾーンに送信します。
    $ aws route53 change-resource-record-sets --hosted-zone-id Z09020002B5MZQNXMSJUB \ --change-batch file://recordset-change.json { "ChangeInfo": { "Id": "/change/C0137926I56R3GC7XW2Y", "Status": "PENDING", "SubmittedAt": "2022-05-05T13:40:36.553000+00:00" } }
  12. 次の内容でポリシードキュメント policy.json を作成します。
    { "Version": "2012-10-17", "Statement": [ { "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-abc123" ], "Effect": "Allow" } ] }
  13. 次の内容で policy.json と言う名前のポリシードキュメントを作成します。
    $ aws iam create-policy --policy-name ReadCertExample \ --policy-document file://policy.json { "Policy": { "PolicyName": "ReadCertExample", "PolicyId": "ANPAUUXUVBC42VZSI4LDY", "Arn": "arn:aws:iam::123456789012:policy/ReadCertExample-efg456", "Path": "/", "DefaultVersionId": "v1", "AttachmentCount": 0, "PermissionsBoundaryUsageCount": 0, "IsAttachable": true, "CreateDate": "2022-05-05T13:42:18+00:00", "UpdateDate": "2022-05-05T13:42:18+00:00" } }
  14. 引き続き、(オプション) ステップ 2: AD ユーザーとグループの管理 または ステップ 3: クラスターの作成 のステップを実行します。

このステップでは、Active Delivery (AD) ドメインに結合している EC2 Amazon Linux 2 インスタンスからユーザーとグループを管理します。

自動パスに従った場合は、オートメーションの一部として作成した AD に結合されたインスタンスを再起動してログインします。

手動パスに従った場合は、前のステップで作成して AD に結合したインスタンスを再起動してログインします。

これらのステップでは、前のステップの一部としてインスタンスにインストールした adcli ツールと openldap-clients ツールを使用します。

AD ドメインと結合した EC2 インスタンスへのログイン
  1. EC2 コンソールから、前のステップで作成したタイトルのない EC2 インスタンスを選択します。インスタンスの状態は [停止] になっている可能性があります。

  2. インスタンスの状態が [停止] の場合は、[インスタンスの状態] を選択し、[インスタンスを開始] を選択します。

  3. ステータスチェックに合格したら、インスタンスを選択して [接続] を選択して、インスタンスに SSH 接続します。

AD に結合している EC2 Amazon Linux 2 インスタンスにログインしたときのユーザーとグループの管理

-U "Admin" オプションで adcli コマンドを実行すると、AD Admin パスワードの入力を求められます。ldapsearch コマンドの一部として AD Admin パスワードを含めます。

  1. ユーザーを作成します。
    $ adcli create-user "clusteruser" --domain "corp.example.com" -U "Admin"
  2. ユーザーパスワードを設定します。
    $ aws --region "region-id" ds reset-user-password --directory-id "d-abcdef01234567890" --user-name "clusteruser" --new-password "new-p@ssw0rd"
  3. グループを作成します。
    $ adcli create-group "clusterteam" --domain "corp.example.com" -U "Admin"
  4. ユーザーをグループに追加します。
    $ adcli add-member "clusterteam" "clusteruser" --domain "corp.example.com" -U "Admin"
  5. ユーザーとグループについて説明します。

    すべてのユーザーついて説明します。

    $ ldapsearch "(&(objectClass=user))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    特定のユーザーについて説明します。

    $ ldapsearch "(&(objectClass=user)(cn=clusteruser))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    すべてのユーザーを名前パターンで説明します。

    $ ldapsearch "(&(objectClass=user)(cn=user*))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    特定のグループに属するすべてのユーザーについて説明します。

    $ ldapsearch "(&(objectClass=user)(memberOf=CN=clusterteam,OU=Users,OU=CORP,DC=corp,DC=example,DC=com))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    全てのグループについて説明します。

    $ ldapsearch "objectClass=group" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    特定のグループについて説明します。

    $ ldapsearch "(&(objectClass=group)(cn=clusterteam))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"
  6. グループからユーザーを削除します。
    $ adcli remove-member "clusterteam" "clusteruser" --domain "corp.example.com" -U "Admin"
  7. ユーザーを削除します。
    $ adcli delete-user "clusteruser" --domain "corp.example.com" -U "Admin"
  8. グループを削除します。
    $ adcli delete-group "clusterteam" --domain "corp.example.com" -U "Admin"

EC2 インスタンスを終了していない場合は、ここで終了します。

Active Directory (AD) に対してユーザーを認証できるクラスターを作成するように環境が設定されます。

簡単なクラスター設定を作成し、AD への接続に関連する設定を行います。詳細については、「DirectoryService」セクションを参照してください。

次のクラスター設定のいずれかを選択し、ldaps_config.yamlldaps_nocert_config.yaml、または ldap_config.yaml という名前のファイルにコピーします。

証明書検証付きの LDAPS 設定を選択することをお勧めします。この設定を選択した場合は、ブートストラップスクリプトを active-directory.head.post.sh という名前のファイルにコピーする必要もあります。また、設定ファイルに示しているように Amazon S3 バケットに保存する必要があります。

注記
以下のコンポーネントは変更する必要があります。
  • KeyName: EC2 キーペアのいずれか。

  • SubnetId / SubnetIds: CloudFormation クイック作成スタック (自動チュートリアル) または Python スクリプト (手動チュートリアル) の出力で提供されるサブネット ID のいずれか。

  • Region: AD インフラストラクチャを作成したリージョン。

  • DomainAddr: この IP アドレスは AD サービスの DNS アドレスの 1 つ。

  • PasswordSecretArn: DomainReadOnlyUser のパスワードが含まれているシークレットの Amazon リソースネーム (ARN)。

  • BucketName: ブートストラップスクリプトを保持するバケットの名前。

  • AdditionalPolicies/Policy: ReadCertExample 読み取りドメイン証明書ポリシーの Amazon リソースネーム (ARN)。

  • CustomActions/OnNodeConfigured/Args: ドメイン認定ポリシーを保持するシークレットの Amazon リソースネーム (ARN)。

セキュリティを強化するために、HeadNodeSsh//AllowedIps設定を使用してヘッドノードへの SSH アクセスを制限することをお勧めします。

Region: region-id Image: Os: alinux2 HeadNode: InstanceType: t2.micro Networking: SubnetId: subnet-abcdef01234567890 Ssh: KeyName: keypair Iam: AdditionalIamPolicies: - Policy: arn:aws:iam::123456789012:policy/ReadCertExample S3Access: - BucketName: my-bucket EnableWriteAccess: false KeyName: bootstrap/active-directory/active-directory.head.post.sh CustomActions: OnNodeConfigured: Script: s3://my-bucket/bootstrap/active-directory/active-directory.head.post.sh Args: - arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc - /opt/parallelcluster/shared/directory_service/domain-certificate.crt Scheduling: Scheduler: slurm SlurmQueues: - Name: queue0 ComputeResources: - Name: queue0-t2-micro InstanceType: t2.micro MinCount: 1 MaxCount: 10 Networking: SubnetIds: - subnet-abcdef01234567890 DirectoryService: DomainName: corp.example.com DomainAddr: ldaps://corp.example.com PasswordSecretArn: arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234 DomainReadOnlyUser: cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com LdapTlsCaCert: /opt/parallelcluster/shared/directory_service/domain-certificate.crt LdapTlsReqCert: hard

ブートストラップスクリプト

ブートストラップファイルを作成した後、S3 バケットにアップロードする前に、chmod +x active-directory.head.post.sh を実行して、AWS ParallelCluster に実行アクセス許可を与えます。

#!/bin/bash set -e CERTIFICATE_SECRET_ARN="$1" CERTIFICATE_PATH="$2" [[ -z $CERTIFICATE_SECRET_ARN ]] && echo "[ERROR] Missing CERTIFICATE_SECRET_ARN" && exit 1 [[ -z $CERTIFICATE_PATH ]] && echo "[ERROR] Missing CERTIFICATE_PATH" && exit 1 source /etc/parallelcluster/cfnconfig REGION="${cfn_region:?}" mkdir -p $(dirname $CERTIFICATE_PATH) aws secretsmanager get-secret-value --region $REGION --secret-id $CERTIFICATE_SECRET_ARN --query SecretString --output text > $CERTIFICATE_PATH
注記
以下のコンポーネントは変更する必要があります。
  • KeyName: EC2 キーペアのいずれか。

  • SubnetId / SubnetIds: CloudFormation クイック作成スタック (自動チュートリアル) または Python スクリプト (手動チュートリアル) の出力に含まれるサブネット ID の 1 つ。

  • Region: AD インフラストラクチャを作成したリージョン。

  • DomainAddr: この IP アドレスは AD サービスの DNS アドレスの 1 つ。

  • PasswordSecretArn: DomainReadOnlyUser のパスワードが含まれているシークレットの Amazon リソースネーム (ARN)。

セキュリティを強化するために、 HeadNode /Ssh/ AllowedIps 設定を使用してヘッドノードへの SSH アクセスを制限することをお勧めします。

Region: region-id Image: Os: alinux2 HeadNode: InstanceType: t2.micro Networking: SubnetId: subnet-abcdef01234567890 Ssh: KeyName: keypair Scheduling: Scheduler: slurm SlurmQueues: - Name: queue0 ComputeResources: - Name: queue0-t2-micro InstanceType: t2.micro MinCount: 1 MaxCount: 10 Networking: SubnetIds: - subnet-abcdef01234567890 DirectoryService: DomainName: corp.example.com DomainAddr: ldaps://corp.example.com PasswordSecretArn: arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234 DomainReadOnlyUser: cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com LdapTlsReqCert: never
注記
以下のコンポーネントは変更する必要があります。
  • KeyName: EC2 キーペアのいずれか。

  • SubnetId / SubnetIds: CloudFormation クイック作成スタック (自動チュートリアル) または Python スクリプト (手動チュートリアル) の出力で提供されるサブネット ID のいずれか。

  • Region: AD インフラストラクチャを作成したリージョン。

  • DomainAddr: この IP アドレスは AD サービスの DNS アドレスの 1 つ。

  • PasswordSecretArn: DomainReadOnlyUser のパスワードが含まれているシークレットの Amazon リソースネーム (ARN)。

セキュリティを強化するために、 HeadNode /Ssh/ AllowedIps 設定を使用してヘッドノードへの SSH アクセスを制限することをお勧めします。

Region: region-id Image: Os: alinux2 HeadNode: InstanceType: t2.micro Networking: SubnetId: subnet-abcdef01234567890 Ssh: KeyName: keypair Scheduling: Scheduler: slurm SlurmQueues: - Name: queue0 ComputeResources: - Name: queue0-t2-micro InstanceType: t2.micro MinCount: 1 MaxCount: 10 Networking: SubnetIds: - subnet-abcdef01234567890 DirectoryService: DomainName: dc=corp,dc=example,dc=com DomainAddr: ldap://192.0.2.254,ldap://203.0.113.237 PasswordSecretArn: arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234 DomainReadOnlyUser: cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com AdditionalSssdConfigs: ldap_auth_disable_tls_never_use_in_production: True

以下のコマンドを使用して、クラスターを作成します。

$ pcluster create-cluster --cluster-name "ad-cluster" --cluster-configuration "./ldaps_config.yaml" { "cluster": { "clusterName": "pcluster", "cloudformationStackStatus": "CREATE_IN_PROGRESS", "cloudformationStackArn": "arn:aws:cloudformation:region-id:123456789012:stack/ad-cluster/1234567-abcd-0123-def0-abcdef0123456", "region": "region-id", "version": 3.7.0, "clusterStatus": "CREATE_IN_PROGRESS" } }

クラスターのステータスは、次のコマンドを使用して確認できます。

$ pcluster describe-cluster -n ad-cluster --region "region-id" --query "clusterStatus"

出力は次のとおりです。

"CREATE_IN_PROGRESS" / "CREATE_COMPLETE"

ステータスが "CREATE_COMPLETE" になったら、作成したユーザー名とパスワードでログインします。

$ HEAD_NODE_IP=$(pcluster describe-cluster -n "ad-cluster" --region "region-id" --query headNode.publicIpAddress | xargs echo)
$ ssh user000@$HEAD_NODE_IP

/home/user000@HEAD_NODE_IP/.ssh/id_rsa で新しいユーザー用に作成した SSH キーを提供することで、パスワードなしでログインできます。

ssh コマンドが成功すると、Active Directory (AD) を使用するように認証されたユーザーとしてクラスターに正常に接続されたことになります。

  1. ローカルマシンからクラスターを削除します。
    $ pcluster delete-cluster --cluster-name "ad-cluster" --region "region-id" { "cluster": { "clusterName": "ad-cluster", "cloudformationStackStatus": "DELETE_IN_PROGRESS", "cloudformationStackArn": "arn:aws:cloudformation:region-id:123456789012:stack/ad-cluster/1234567-abcd-0123-def0-abcdef0123456", "region": "region-id", "version": "3.7.0", "clusterStatus": "DELETE_IN_PROGRESS" } }
  2. 削除中のクラスターの進行状況を確認します。
    $ pcluster describe-cluster --cluster-name "ad-cluster" --region "region-id" --query "clusterStatus" "DELETE_IN_PROGRESS"

    クラスターが正常に削除されたら、次のステップに進みます。

Active Directory リソースの削除
  1. https://console.aws.amazon.com/cloudformation/ から。

  2. ナビゲーションペインで、[Stacks] を選択します。

  3. スタックのリストから AD スタック (例: pcluster-ad) を選択します。

  4. [削除] をクリックします。

  1. EC2 インスタンスを削除します。
    1. https://console.aws.amazon.com/ec2/ から、ナビゲーションペインで [インスタンス] を選択します。

    2. インスタンスのリストから、ユーザーをディレクトリに追加するために作成したインスタンスを選択します。

    3. [インスタンスの状態][インスタンスの終了] の順に選択します。

  2. ホストゾーンを削除します。
    1. 以下のコンテンツで recordset-delete.json を作成します。この例では、 HostedZoneId はロードバランサーの正規ホストゾーン ID です。

      { "Changes": [ { "Action": "DELETE", "ResourceRecordSet": { "Name": "corp.example.com", "Type": "A", "Region": "region-id", "SetIdentifier": "pcluster-active-directory", "AliasTarget": { "HostedZoneId": "Z2IFOLAFXWLO4F", "DNSName": "CorpExampleCom-NLB-3afe296bf4ba80d4.elb.region-id.amazonaws.com", "EvaluateTargetHealth": true } } } ] }
    2. ホストゾーン ID を使用して、レコードセットの変更をホストゾーンに送信します。

      $ aws route53 change-resource-record-sets --hosted-zone-id Z09020002B5MZQNXMSJUB \ --change-batch file://recordset-delete.json { "ChangeInfo": { "Id": "/change/C04853642A0TH2TJ5NLNI", "Status": "PENDING", "SubmittedAt": "2022-05-05T14:25:51.046000+00:00" } }
    3. ホストゾーンを削除します。

      $ aws route53 delete-hosted-zone --id Z09020002B5MZQNXMSJUB { "ChangeInfo": { "Id": "/change/C0468051QFABTVHMDEG9", "Status": "PENDING", "SubmittedAt": "2022-05-05T14:26:13.814000+00:00" } }
  3. LB リスナーを削除します。
    $ aws elbv2 delete-listener \ --listener-arn arn:aws:elasticloadbalancing:region-id:123456789012:listener/net/CorpExampleCom-NLB/3afe296bf4ba80d4/a8f9d97318743d4b --region region-id
  4. ターゲットグループを削除します。
    $ aws elbv2 delete-target-group \ --target-group-arn arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81 --region region-id
  5. ロードバランサーを削除します。
    $ aws elbv2 delete-load-balancer \ --load-balancer-arn arn:aws:elasticloadbalancing:region-id:123456789012:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4 --region region-id
  6. クラスターが Secrets Manager から証明書を読み取るために使用するポリシーを削除します。
    $ aws iam delete-policy --policy-arn arn:aws:iam::123456789012:policy/ReadCertExample
  7. ドメイン証明書を含むシークレットを削除します。
    $ aws secretsmanager delete-secret \ --secret-id arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc \ --region region-id { "ARN": "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", "Name": "example-cert", "DeletionDate": "2022-06-04T16:27:36.183000+02:00" }
  8. ACM から証明書を削除します。
    $ aws acm delete-certificate \ --certificate-arn arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72 --region region-id
  9. Active Directory (AD) リソースを削除します。
    1. Python スクリプト ad.py の出力から次のリソース ID を取得します。

      • AD ID

      • AD サブネット ID

      • AD VPC ID

    2. 次のコマンドを実行して、ディレクトリを削除します。

      $ aws ds delete-directory --directory-id d-abcdef0123456789 --region region-id { "DirectoryId": "d-abcdef0123456789" }
    3. VPC 内のセキュリティグループを一覧表示します。

      $ aws ec2 describe-security-groups --filters '[{"Name":"vpc-id","Values":["vpc-07614ade95ebad1bc"]}]' --region region-id
    4. カスタムセキュリティグループを削除します。

      $ aws ec2 delete-security-group --group-id sg-021345abcdef6789 --region region-id
    5. サブネットを削除します。

      $ aws ec2 delete-subnet --subnet-id subnet-1234567890abcdef --region region-id
      $ aws ec2 delete-subnet --subnet-id subnet-021345abcdef6789 --region region-id
    6. インターネットゲートウェイについて説明します。

      $ aws ec2 describe-internet-gateways \ --filters Name=attachment.vpc-id,Values=vpc-021345abcdef6789 \ --region region-id { "InternetGateways": [ { "Attachments": [ { "State": "available", "VpcId": "vpc-021345abcdef6789" } ], "InternetGatewayId": "igw-1234567890abcdef", "OwnerId": "123456789012", "Tags": [] } ] }
    7. インターネットゲートウェイをデタッチします。

      $ aws ec2 detach-internet-gateway \ --internet-gateway-id igw-1234567890abcdef \ --vpc-id vpc-021345abcdef6789 \ --region region-id
    8. インターネットゲートウェイを削除します。

      $ aws ec2 delete-internet-gateway \ --internet-gateway-id igw-1234567890abcdef \ --region region-id
    9. VPC を削除します。

      $ aws ec2 delete-vpc \ --vpc-id vpc-021345abcdef6789 \ --region region-id
    10. ReadOnlyUser パスワードを含むシークレットを削除します。

      $ aws secretsmanager delete-secret \ --secret-id arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234" \ --region region-id