本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立 AD 基礎設施
選擇自動化索引標籤,使用 CloudFormation 快速建立範本建立 Active Directory (AD) 基礎設施。
選擇手動索引標籤以手動建立 AD 基礎設施。
-
登入 AWS 管理主控台。
-
開啟 CloudFormation Quick Create (region us-east-1)
,以在 CloudFormation 主控台中建立下列資源: -
如果未指定 VPC,則具有兩個子網路和路由以進行公開存取的 VPC。
-
AWS Managed Microsoft AD。
-
加入 AD 的 Amazon EC2 執行個體,可用來管理目錄。
-
-
在快速建立堆疊頁面參數區段中,輸入下列參數的密碼:
-
AdminPassword
-
ReadOnlyPassword
-
UserPassword
請記下密碼。您稍後在本教學課程中使用它們。
-
-
針對 DomainName,輸入
corp.example.com -
針對 Keypair,輸入 Amazon EC2 金鑰對的名稱。
-
勾選方塊以確認頁面底部的每個存取功能。
-
選擇建立堆疊。
-
在 CloudFormation 堆疊達到
CREATE_COMPLETE狀態後,選擇堆疊的輸出索引標籤。請記下輸出資源名稱和 IDs,因為您需要在後續步驟中使用它們。輸出提供建立叢集所需的資訊。
-
若要完成練習 (選用) 管理 AD 使用者和群組,您需要目錄 ID。選擇資源並向下捲動,以記下目錄 ID。
-
在 (選用) 管理 AD 使用者和群組或 繼續建立叢集。
為目錄服務建立 VPC,其中兩個子網路位於不同的可用區域和 AWS Managed Microsoft AD。
注意
-
目錄和網域名稱為
corp.example.com。簡短名稱為CORP。 -
變更指令碼中的
Admin密碼。 -
Active Directory (AD) 至少需要 15 分鐘才能建立。
使用下列 Python 指令碼在本機建立 VPC、子網路和 AD 資源 AWS 區域。將此檔案儲存為 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。您可以在後續步驟中使用它們。
指令碼完成後,請繼續下一個步驟。
-
連線至您的執行個體,並以 身分加入 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.pemec2-user@$PUBLIC_IP -
安裝必要的軟體並加入領域。
$sudo yum -y install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python -
將管理員密碼取代為
admin您的密碼。$ADMIN_PW="asdfASDF1234"$echo $ADMIN_PW | sudo realm join -U Admincorp.example.comPassword for Admin:如果上述 成功,您就會加入領域,並且可以繼續進行下一個步驟。
-
建立 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 -
確認已建立使用者:
目錄 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,會停用該使用者。 -
從本機電腦重設和啟用使用者密碼:
登出 Amazon EC2 執行個體。
注意
-
ro-p@ssw0rd是從ReadOnlyUser擷取的密碼 AWS 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" -
-
將密碼新增至 Secrets Manager 秘密。
現在您已建立
ReadOnlyUser並設定密碼,請將它存放在 AWS ParallelCluster 用於驗證登入的秘密中。使用 Secrets Manager 建立新的秘密,將 的密碼保留
ReadOnlyUser為 值。秘密值格式必須是純文字 (而非 JSON 格式)。記下秘密 ARN 以供未來步驟使用。$aws secretsmanager create-secret --name"ADSecretPassword"\ --regionregion_id\ --secret-string"ro-p@ssw0rd"\ --query ARN \ --output textarn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234
記下資源 IDs。您稍後會在步驟中使用它們。
-
在本機產生網域憑證。
$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 -
將憑證儲存到 Secrets Manager,以便稍後可從叢集內擷取。
$aws secretsmanager create-secret --name example-cert \ --secret-string file://$CERTIFICATE \ --regionregion-id{ "ARN": "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", "Name": "example-cert", "VersionId": "14866070-092a-4d5a-bcdd-9219d0566b9c" } -
將下列政策新增至您建立的 IAM 角色,以將 Amazon EC2 執行個體加入 AD 網域。
PutDomainCertificateSecrets{ "Statement": [ { "Action": [ "secretsmanager:PutSecretValue" ], "Resource": [ "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc" ], "Effect": "Allow" } ] } -
將憑證匯入至 AWS Certificate Manager (ACM)。
$aws acm import-certificate --certificate fileb://$CERTIFICATE \ --private-key fileb://$PRIVATE_KEY \ --regionregion-id{ "CertificateArn": "arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72" } -
建立 和放在 Active Directory 端點前面的負載平衡器。
$aws elbv2 create-load-balancer --name CorpExampleCom-NLB \ --type network \ --scheme internal \ --subnetssubnet-1234567890abcdef0 subnet-021345abcdef6789\ --regionregion-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" } ] } -
建立以 Active Directory 端點為目標的目標群組。
$aws elbv2 create-target-group --name CorpExampleCom-Targets --protocol TCP \ --port 389 \ --target-type ip \ --vpc-idvpc-021345abcdef6789\ --regionregion-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" } ] } -
將 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 \ --regionregion-id -
使用憑證建立 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\ --regionregion-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" } ] } } ] } ] } -
建立託管區域,以在叢集 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" } } -
使用
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 } } } ] } -
將記錄集變更提交至託管區域,這次使用託管區域 ID。
$aws route53 change-resource-record-sets --hosted-zone-idZ09020002B5MZQNXMSJUB\ --change-batch file://recordset-change.json{ "ChangeInfo": { "Id": "/change/C0137926I56R3GC7XW2Y", "Status": "PENDING", "SubmittedAt": "2022-05-05T13:40:36.553000+00:00" } } -
使用
policy.json下列內容建立政策文件。 -
使用
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" } } -
繼續遵循 (選用) 管理 AD 使用者和群組或 中的步驟建立叢集。