集成 Active - Amazon ParallelCluster
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

集成 Active

在本教程中,您将创建一个多用户环境。此环境包括与Amazon Managed Microsoft AD(AAmazon ParallelCluster ctive Directory)集成的网址corp.example.com。您可以配置一个Admin用户来管理该目录,一个ReadOnly用户配置一个用于读取该目录,并将一个user000用户配置为登录集群。您可以使用自动路径或手动路径来创建网络资源、Active Directory (AD) 和用于配置 AD 的 EC2 实例。无论路径如何,您创建的基础架构都已预先配置为Amazon ParallelCluster使用以下方法之一进行集成:

  • 带证书验证功能的 LDAPS(推荐作为最安全的选项)

  • 没有证书验证的 LDAPS

  • LDAP

LDAP 本身提供加密。为确保潜在敏感信息的安全传输,我们强烈建议您对与 AD 集成的集群使用 LDAPS(基于 TLS/SSL 的 LDAP)。有关更多信息,请参阅《Amazon Directory Service管理指南》Amazon Managed Microsoft AD中的 “使用启用服务器端 LDAPS”。

创建这些资源后,继续配置并创建与 Active Directory (AD) 集成的集群。集群创建之后,以您创建的用户身份登录。有关在本教程中创建的配置的更多信息,请参阅多用户访问集群DirectoryService配置部分。

本教程介绍如何创建支持多用户访问集群的环境。本教程未介绍如何创建和使用 AAmazon Directory Service D。本教程Amazon Managed Microsoft AD中提供的设置步骤仅用于测试目的。它们并不是为了取代你在《Amazon Directory Service管理指南》和 Simp le AD 上可以找到的官方文档Amazon Managed Microsoft AD和最佳实践。

注意

根据目录密码策略属性定义,目录用户密码过期。有关更多信息,请参阅支持的策略设置。要使用重置目录密码Amazon ParallelCluster,请参见如何重置用户密码和过期密码

注意

由于域控制器更改和目录维护,目录域控制器 IP 地址可能会发生变化。如果您选择自动快速创建方法来创建目录基础架构,则当目录 IP 地址发生变化时,必须手动将负载平衡器置于目录控制器前面。如果您使用快速创建方法,则目录 IP 地址不会自动与负载均衡器对齐。

先决条件

在学习本教程时inputs highlighted in red,用自己的名称region-idd-abcdef01234567890 ID 替换(例如和)。0123456789012用你的Amazon Web Services 账户号码替换。

选择 “自动” 选项卡,使用Amazon CloudFormation快速创建模板创建 Active Directory (AD) 基础架构。

选择 “手动” 选项卡手动创建 AD 基础架构。

  1. 登录到 Amazon Web Services Management Console。

  2. 打开 “CloudFormation 快速创建”(区域 us-east-1),在 CloudFormation 控制台中创建以下资源:

    • 具有两个子网的 VPC 和用于公共访问的路由。

    • 一个 Amazon Managed Microsoft AD。

    • 加入 AD 的 EC2 实例,您可以使用它来管理目录。

  3. 快速创建堆栈页面参数部分中,输入以下参数的密码:

    • AdminPassword

    • ReadOnlyPassword

    • UserPassword

    记下此密码。您将在本教程后面用到它们。

  4. 对于 DomainName,输入corp.example.com

  5. 对于 key p air,输入 EC2 密钥对的名称。

  6. 选中复选框以确认页面底部的每项访问功能。

  7. 选择 Create stack(创建堆栈)。

  8. CloudFormation 堆栈达到CREATE_COMPLETE状态后,选择堆栈的 Out p uts 选项卡。记下输出资源名称和 ID,因为您需要在后续步骤中使用它们。输出提供创建集群所需的信息。

    
         该图显示了在中创建的堆栈输出Amazon Web Services Management Console。
  9. 要完成练习(可选)步骤 2:管理 AD 用户和群组,您需要目录 ID。选择资源并向下滚动以记下目录 ID。

  10. (可选)步骤 2:管理 AD 用户和群组或处继续步骤 3:创建集群

为目录服务创建 VPC,其中包含位于不同可用区的两个子网和Amazon Managed Microsoft AD.

注意
  • 目录和域名是corp.example.com。短名是CORP

  • 更改脚本中的Admin密码。

  • 创建活动目录 (AD) 至少需要 15 分钟。

使用以下 Python 脚本在本地创建 VPC、子网和 AD 资源Amazon Web Services 区域。将此文件另存为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. 登录到 Amazon Web Services Management Console。

  2. 如果您没有附上步骤 4 中列出的策略的角色,请打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/。否则,请跳至步骤 5。

  3. 创建ResetUserPassword策略,将红色突出显示的内容替换为你的Amazon Web Services 区域 ID、账户 ID 和为创建 AD 而运行的脚本输出中的目录 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. 应用程序和操作系统映像中,选择最新的亚马逊 Linux 2 AMI。

  8. 对于实例类型,选择 t2.micro。

  9. 对于 key p air,选择一个密钥对。

  10. 对于 “网络设置”,选择 “编辑”

  11. 对于 VPC,选择目录 VPC。

  12. 向下滚动并选择 “高级详细信息”。

  13. 高级详细信息域加入目录中,选择corp.example.com

  14. 对于 IAM 实例配置文件,选择您在步骤 1 中创建的角色或附有步骤 4 中列出的策略的角色。

  15. 摘要中,选择启动实例

  16. 记下实例 ID(例如 i-1234567890abcdef0),然后等待实例完成启动。

  17. 在实例启动后,继续执行下一步。

Old EC2 console
  1. 登录到 Amazon Web Services Management Console。

  2. 如果您没有附上步骤 4 中列出的策略的角色,请打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/。否则,请跳至步骤 5。

  3. 创建ResetUserPassword策略。用您在创建 Active DAmazon Web Services 区域 irectory (AD) 时运行的脚本输出中的 ID、ID 和目录 ID 替换红色突出显示的内容。Amazon Web Services 账户

    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. 应用程序和操作系统映像中,选择最新的亚马逊 Linux 2 AMI。

  8. 对于 Instance type (实例类型),选择 t2.micro。

  9. 对于 key p air,选择一个密钥对。

  10. “网络设置” 中,选择 “编辑”

  11. 网络设置 VPC 中,选择目录 VPC。

  12. 向下滚动并选择 “高级详细信息”。

  13. 高级详细信息域加入目录中,选择corp.example.com

  14. 高级详细信息实例配置文件中,选择您在步骤 1 中创建的角色或附加了步骤 4 中列出的策略的角色。

  15. 摘要中,选择启动实例

  16. 记下实例 ID(例如i-1234567890abcdef0),然后等待实例完成启动。

  17. 在实例启动后,继续执行下一步。

  1. 以身份Connect 您的实例并加入 AD 领域admin

    运行以下命令以连接到实例。

    $ 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-cli ents 工具。

    $ 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是的密码ReadOnlyUser,从中检索Amazon Secrets Manager。

    • 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并设置了密码,请将其存储在Amazon ParallelCluster用于验证登录的密钥中。

    使用 Secrets Manager 创建一个新密钥,将的密码ReadOnlyUser作为值保存。机密值格式必须仅为纯文本(不是 JSON 格式)。记下秘密 ARN 以备future 步骤使用。

    $ 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. 将以下策略添加到您创建的 IAM 角色,以将 EC2 实例加入 AD 域。

    PutDomainCertificateSecrets

    { "Statement": [ { "Action": [ "secretsmanager:PutSecretValue" ], "Resource": [ "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", ], "Effect": "Allow" } ] }
  4. 将证书导入Amazon 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:创建集群

在此步骤中,您将管理加入主动交付 (AD) 域的 EC2 Amazon Linux 2 实例中的用户和群组。

如果您遵循自动路径,请重新启动并登录到作为自动化一部分创建的 AD 加入的实例。

如果您遵循手动路径,请重新启动并登录到您在之前的步骤中创建并加入到 AD 的实例。

在这些步骤中,您将使用作为前面步骤一部分安装在实例中的 adcli 和 openldap-cli ents 工具。

登录加入 AD 域的 EC2 实例
  1. 从 EC2 控制台中,选择在先前步骤中创建的无标题 EC2 实例。实例状态可能为 “已停止”。

  2. 如果实例状态为已停止,请选择实例状态,然后选择启动实例

  3. 状态检查通过后,选择该实例并选择 Connect 并SSH进入该实例。

登录加入了 AD 的 EC2 Amazon Linux 2 实例时管理用户和群组

当你运行带有 -U "Admin"选项的adcli命令时,系统会提示你输入 ADAdmin 密码。您可以将 ADAdmin 密码作为ldapsearch命令的一部分。

  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 地址之一。

  • PasswordSecretArn:包含的密码的密钥的 Amazon 资源名称(ARN)DomainReadOnlyUser

  • BucketName:存放引导脚本的存储桶的名称。

  • AdditionalPolicies/Policy:读取域认证策略的亚马逊资源名称 (ARN) ReadCertExample。

  • CustomActions/OnNodeConfigured/Args:包含域名认证政策的密钥的亚马逊资源名称 (ARN)。

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以授予Amazon 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 之一。

  • Region:您创建 AD 基础架构的区域。

  • DomainAddr:此 IP 地址是您的 AD 服务的 DNS 地址之一。

  • PasswordSecretArn:包含的密码的密钥的 Amazon 资源名称(ARN)DomainReadOnlyUser

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 地址之一。

  • PasswordSecretArn:包含的密码的密钥的 Amazon 资源名称(ARN)DomainReadOnlyUser

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.5.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

您可以通过提供为新用户创建的SSH密钥在不使用密码的情况下登录/home/user000@HEAD_NODE_IP/.ssh/id_rsa

如果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.5.0", "clusterStatus": "DELETE_IN_PROGRESS" } }
  2. 检查集群的删除进度。
    $ pcluster describe-cluster --cluster-name "ad-cluster" --region "region-id" --query "clusterStatus" "DELETE_IN_PROGRESS"

    成功删除集群后,继续执行下一步。

删除活动目录资源
  1. 来自 https://console.aws.amazon.com/cloudformation/

  2. 在导航窗格中,选择 Stacks (堆栈)

  3. 从堆栈列表中选择 AD 堆栈(例如pcluster-ad)。

  4. 选择 Delete(删除)

  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. 删除AD 资源。
    1. 从 python 脚本的输出中获取以下资源 IDad.py

      • 广告编号

      • AD 子网 ID

      • 添加 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