本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
集成 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 地址不会自动与负载均衡器对齐。
先决条件
-
Amazon ParallelCluster已安装。
-
Amazon CLI已安装并配置。
-
您有一个 EC2 key pair。
在学习本教程时
,用自己的名称inputs highlighted in red
和region-id
ID 替换(例如和)。d-abcdef01234567890
用你的Amazon Web Services 账户号码替换。0123456789012
选择 “自动” 选项卡,使用Amazon CloudFormation快速创建模板创建 Active Directory (AD) 基础架构。
选择 “手动” 选项卡手动创建 AD 基础架构。
-
登录到 Amazon Web Services Management Console。
-
打开 “CloudFormation 快速创建”(区域 us-east-1)
,在 CloudFormation 控制台中创建以下资源: -
具有两个子网的 VPC 和用于公共访问的路由。
-
一个 Amazon Managed Microsoft AD。
-
加入 AD 的 EC2 实例,您可以使用它来管理目录。
-
-
在快速创建堆栈页面参数部分中,输入以下参数的密码:
-
AdminPassword
-
ReadOnlyPassword
-
UserPassword
记下此密码。您将在本教程后面用到它们。
-
-
对于 DomainName,输入
corp.example.com
-
对于 key p air,输入 EC2 密钥对的名称。
-
选中复选框以确认页面底部的每项访问功能。
-
选择 Create stack(创建堆栈)。
-
CloudFormation 堆栈达到
CREATE_COMPLETE
状态后,选择堆栈的 Out p uts 选项卡。记下输出资源名称和 ID,因为您需要在后续步骤中使用它们。输出提供创建集群所需的信息。 -
要完成练习(可选)步骤 2:管理 AD 用户和群组,您需要目录 ID。选择资源并向下滚动以记下目录 ID。
为目录服务创建 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。您可以在后面的步骤中用到它们。
脚本完成后,继续执行下一步。
-
以身份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 -
安装必要的软件并加入该领域。
$
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 Admin
corp.example.com
Password for Admin:
如果前面的操作成功,则您将加入到该领域,并可以继续下一步。
-
创建 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
-
验证用户是否已创建:
目录 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
,该用户处于禁用状态。 -
重置并激活本地计算机上的用户密码:
注销您的 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"
-
-
将密码添加到Secrets Manager 密钥。
现在您已创建
ReadOnlyUser
并设置了密码,请将其存储在Amazon ParallelCluster用于验证登录的密钥中。使用 Secrets Manager 创建一个新密钥,将的密码
ReadOnlyUser
作为值保存。机密值格式必须仅为纯文本(不是 JSON 格式)。记下秘密 ARN 以备future 步骤使用。$
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
记下资源 ID。您可以稍后分步使用它们。
-
在本地生成域证书。
$
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 角色,以将 EC2 实例加入 AD 域。
PutDomainCertificateSecrets
{ "Statement": [ { "Action": [ "secretsmanager:PutSecretValue" ], "Resource": [ "arn:aws:secretsmanager:
region-id
:123456789012
:secret:example-cert-123abc
", ], "Effect": "Allow" } ] } -
将证书导入Amazon 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
的策略文档。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:
region-id
:123456789012
:secret:example-cert-abc123
" ], "Effect": "Allow" } ] } -
利用以下内容创建名为
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" } }
-
继续按照(可选)步骤 2:管理 AD 用户和群组或中的步骤操作步骤 3:创建集群。
在此步骤中,您将管理加入主动交付 (AD) 域的 EC2 Amazon Linux 2 实例中的用户和群组。
如果您遵循自动路径,请重新启动并登录到作为自动化一部分创建的 AD 加入的实例。
如果您遵循手动路径,请重新启动并登录到您在之前的步骤中创建并加入到 AD 的实例。
在这些步骤中,您将使用作为前面步骤一部分安装在实例中的 adcli
登录加入 AD 域的 EC2 实例
-
从 EC2 控制台中,选择在先前步骤中创建的无标题 EC2 实例。实例状态可能为 “已停止”。
-
如果实例状态为已停止,请选择实例状态,然后选择启动实例。
-
状态检查通过后,选择该实例并选择 Connect 并SSH进入该实例。
登录加入了 AD 的 EC2 Amazon Linux 2 实例时管理用户和群组
当你运行带有 -U "Admin"
选项的adcli
命令时,系统会提示你输入 ADAdmin
密码。您可以将 ADAdmin
密码作为ldapsearch
命令的一部分。
-
创建用户。
$
adcli create-user
"clusteruser"
--domain"corp.example.com"
-U "Admin" -
设置用户密码。
$
aws --region
"region-id"
ds reset-user-password --directory-id"d-abcdef01234567890"
--user-name"clusteruser"
--new-password"new-p@ssw0rd"
-
创建组。
$
adcli create-group
"clusterteam"
--domain"corp.example.com"
-U "Admin" -
将用户添加到组中。
$
adcli add-member
"clusterteam"
"clusteruser"
--domain"corp.example.com"
-U "Admin" -
描述用户和群组。
描述所有用户。
$
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"
-
从组中删除用户。
$
adcli remove-member
"clusterteam"
"clusteruser"
--domain"corp.
-U "Admin"example
.com" -
删除用户。
$
adcli delete-user
"clusteruser"
--domain"corp.
-U "Admin"example
.com" -
删除组。
$
adcli delete-group
"clusterteam"
--domain"corp.
-U "Admin"example
.com"
如果您尚未退出 EC2 实例,请立即退出。
该环境的设置是为了创建一个集群,该集群可以根据 Active Directory (AD) 对用户进行身份验证。
创建简单的集群配置并提供与连接到 AD 相关的设置。想要了解更多信息,请参阅 DirectoryService 部分。
选择以下群集配置之一,并将其复制到名为ldaps_config.yaml
ldaps_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) 的用户身份连接到集群。
-
从您的本地计算机中删除集群。
$
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" } }
-
检查集群的删除进度。
$
pcluster describe-cluster --cluster-name
"ad-cluster"
--region"region-id"
--query "clusterStatus""DELETE_IN_PROGRESS"
成功删除集群后,继续执行下一步。
删除活动目录资源
-
在导航窗格中,选择 Stacks (堆栈)。
-
从堆栈列表中选择 AD 堆栈(例如
pcluster-ad
)。 -
选择 Delete(删除)。
-
删除 EC2 实例。
-
在 https://console.aws.amazon.com/ec2/
中,在导航窗格中选择实例。 -
从实例列表中,选择您创建的实例以将用户添加到目录中。
-
选择实例状态,然后选择终止实例。
-
-
删除托管区域。
-
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 } } } ] } -
使用托管区域 ID 将记录集更改提交到托管区域。
$
aws route53 change-resource-record-sets --hosted-zone-idZ09020002B5MZQNXMSJUB
\ --change-batch file://recordset-delete.json{ "ChangeInfo": { "Id": "/change/C04853642A0TH2TJ5NLNI", "Status": "PENDING", "SubmittedAt": "2022-05-05T14:25:51.046000+00:00" } }
-
删除托管区域。
$
aws route53 delete-hosted-zone --idZ09020002B5MZQNXMSJUB
{ "ChangeInfo": { "Id": "/change/C0468051QFABTVHMDEG9", "Status": "PENDING", "SubmittedAt": "2022-05-05T14:26:13.814000+00:00" } }
-
-
删除 LB 侦听器。
$
aws elbv2 delete-listener \ --listener-arn arn:aws:elasticloadbalancing:region-id
:123456789012
:listener/net/CorpExampleCom-NLB/3afe296bf4ba80d4/a8f9d97318743d4b
--regionregion-id
-
删除目标组。
$
aws elbv2 delete-target-group \ --target-group-arn arn:aws:elasticloadbalancing:region-id
:123456789012
:targetgroup/CorpExampleCom-Targets/44577c583b695e81
--regionregion-id
-
删除负载均衡器。
$
aws elbv2 delete-load-balancer \ --load-balancer-arn arn:aws:elasticloadbalancing:region-id
:123456789012
:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4
--regionregion-id
-
删除集群用来从 Secrets Manager 读取证书的策略。
$
aws iam delete-policy --policy-arn arn:aws:iam::123456789012
:policy/ReadCertExample -
删除包含域证书的密钥。
$
aws secretsmanager delete-secret \ --secret-id arn:aws:secretsmanager:region-id
:123456789012
:secret:example-cert-123abc
\ --regionregion-id
{ "ARN": "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", "Name": "example-cert", "DeletionDate": "2022-06-04T16:27:36.183000+02:00" }
-
从 ACM 中删除证书。
$
aws acm delete-certificate \ --certificate-arn arn:aws:acm:region-id
:123456789012
:certificate/343db133-490f-4077-b8d4-3da5bfd89e72
--regionregion-id
-
删除AD 资源。
-
从 python 脚本的输出中获取以下资源 ID
ad.py
:-
广告编号
-
AD 子网 ID
-
添加 VPC ID
-
-
通过运行以下命令删除目录。
$
aws ds delete-directory --directory-idd-abcdef0123456789
--regionregion-id
{ "DirectoryId": "d-abcdef0123456789" }
-
列出 VPC 中的安全组。
$
aws ec2 describe-security-groups --filters '[{"Name":"vpc-id","Values":["vpc-07614ade95ebad1bc"]}]' --regionregion-id
-
删除自定义安全组。
$
aws ec2 delete-security-group --group-idsg-021345abcdef6789
--regionregion-id
-
删除子网。
$
aws ec2 delete-subnet --subnet-idsubnet-1234567890abcdef
--regionregion-id
$
aws ec2 delete-subnet --subnet-idsubnet-021345abcdef6789
--regionregion-id
-
描述互联网网关。
$
aws ec2 describe-internet-gateways \ --filters Name=attachment.vpc-id,Values=vpc-021345abcdef6789
\ --regionregion-id
{ "InternetGateways": [ { "Attachments": [ { "State": "available", "VpcId": "vpc-021345abcdef6789" } ], "InternetGatewayId": "igw-1234567890abcdef", "OwnerId": "123456789012", "Tags": [] } ] }
-
分离互联网网关。
$
aws ec2 detach-internet-gateway \ --internet-gateway-idigw-1234567890abcdef
\ --vpc-idvpc-021345abcdef6789
\ --regionregion-id
-
删除互联网网关。
$
aws ec2 delete-internet-gateway \ --internet-gateway-idigw-1234567890abcdef
\ --regionregion-id
-
删除 VPC
$
aws ec2 delete-vpc \ --vpc-idvpc-021345abcdef6789
\ --regionregion-id
-
删除包含
ReadOnlyUser
密码的密钥。$
aws secretsmanager delete-secret \ --secret-id arn:aws:secretsmanager:region-id
:123456789012
:secret:ADSecretPassword-1234
" \ --regionregion-id
-