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

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

创建 AD 基础设施

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

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

  1. 登录到 Amazon Web Services 管理控制台。

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

    • 具有两个子网的 VPC 和公有访问路由(如果未指定 VPC)。

    • 一个 Amazon Managed Microsoft AD。

    • 已加入 AD 的 Amazon EC2 实例,可用于管理目录。

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

    • AdminPassword

    • ReadOnlyPassword

    • UserPassword

    记下这些密码。本教程后面将会用到这些密码。

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

  5. 对于 Keypair,请输入亚马逊 EC2 密钥对的名称。

  6. 在页面底部选中各个框以确认各项访问功能。

  7. 选择创建堆栈

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

    显示在 Amazon Web Services 管理控制台中创建的堆栈输出的示意图。
  9. 要完成练习(可选)管理 AD 用户和组,您需要目录 ID。选择资源并向下滚动,记下目录 ID。

  10. 继续(可选)管理 AD 用户和组创建集群

为目录服务创建在不同可用区中具有两个子网的 VPC 以及 Amazon Managed Microsoft AD。

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

  • 在脚本中更改 Admin 密码。

  • 创建 Active Directory (AD) 至少需要 15 分钟。

使用以下 Python 脚本在您的本地 Amazon Web Services 区域创建 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" }

记下输出资源名称和 IDs。您将在后面的步骤中用到它们。

脚本完成后,继续执行下一步。

New Amazon EC2 console
  1. 登录到 Amazon Web Services 管理控制台。

  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. Amazon EC2 控制面板中,选择启动实例

  7. 应用程序和操作系统映像中,选择最近的 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 Amazon EC2 console
  1. 登录到 Amazon Web Services 管理控制台。

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

  3. 创建 ResetUserPassword 策略。将红色突出显示的内容替换为您的 Amazon Web Services 区域 ID、 Amazon Web Services 账户 ID 和您为创建 Active Directory (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. Amazon EC2 控制面板中,选择启动实例

  7. 应用程序和操作系统映像中,选择最近的 Amazon Linux 2 AMI。

  8. 对于实例类型,选择 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 和其他用户。

    在此步骤中,您将使用在前一步中安装的 adcliopenldap-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. 在本地计算机上重置并激活用户密码:

    注销您的 Amazon 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,以在后面的步骤中使用。

    $ 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

记下资源 IDs。您将在后面的步骤中用到它们。

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

    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
    JSON
    { "Version":"2012-10-17", "Statement": [ { "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:us-east-1: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. 继续按照 (可选)管理 AD 用户和组创建集群 中的步骤操作。