开发Apple系统(iPhone、iPad、Watch、TV或Vision Pro)应用程序时,在开发工作流的某些节点上,用户必须使用macOS机器。为了方便起见,用户可以选择通过亚马逊云科技EC2创建macOS实例。本文将为大家介绍在亚马逊云科技云中启动、连接和配置基于macOS的虚拟机教程。
点击进入:https://portal.aws.amazon.com/billing/signup#/start/email
一、CLI:使用SSH连接
使用SSH是最常见的方法。要建立与EC2 Mac实例的SSH连接,有三个前提条件:
- 在启动实例时,指定了用于用户身份验证的SSH密钥对。注意:SSH密钥对只能在启动实例时指定。如果用户在启动实例时没有指定密钥对,就可以终止实例并在同一台专用主机上启动新实例(在终止实例时,可能需要一段时间来清理数据,然后对应资源才能再次可用)。
- 实例必须部署在具有公网连接能力的VPC中(VPC包含公共子网),并且实例具有公网IP地址。启动EC2实例时,相关参数的的默认值即指定开通实例的公网连接能力。
- 用户已将一个安全组与自己的EC2 Mac实例关联。安全组允许来自用户的本地电脑IP地址或客户端网络IP范围的入站TCP 22(SSH)流量访问该实例。
若满足这三个前提条件,则连接macOS实例与连接Linux实例的方法相同。本示例中,密钥对关联的用户名是ec2-user。用户需要使用-i选项来引用存储在本地电脑上的私钥。
用户可以在亚马逊云科技控制台查看EC2实例的IP地址。或者,用户可以在CLI中运行以下命令来查询实例的IP地址。本示例中,当前账户下只有一个mac1.metal实例在运行。命令返回该实例的IP地址是1.0.0.0。
aws ec2 describe-instances \
--query "Reservations[].Instances[? InstanceType == 'mac1.metal'].NetworkInterfaces[][].Association.PublicIp"
# Response
[
1.0.0.0
]
使用SSH的-i选项引用私有密钥文件pem,并在命令中指定亚马逊云科技为用户的macOS机器创建的默认用户名。本示例中的用户名为:ec2-user。以下示例代码连接了Big Sur实例(请务必将1.0.0.0替换为用户的实例的IP地址)。
ssh -i ./path_to/my_private_key.pem ec2-user@1.0.0.0
Last login: Fri Jul 1 12:07:28 2022 from 52.95.4.11
┌───┬──┐ __| __|_ )
│ ╷╭╯╷ │ _| ( /
│ └╮ │ ___|\___|___|
│ ╰─┼╯ │ Amazon EC2
└───┴──┘ macOS Big Sur 11.6.6
ec2-user@ip-172-31-44-83 ~ %
连接后,请查看用户的实例的各项信息,了解该实例。检查macOS是否安装成功。
ec2-user包含在/etc/sudoers文件中。就可以使用sudo命令将其权限提升为root。该操作无需密码。
二、CLI:使用Amazon SSM连接
为了提高EC2 Mac实例的安全性和优化管理,用户可以使用Amazon Systems Manager(SSM)的Session Manager功能。
与SSH相比,通过SSM进行连接有两个优点。1.不需要来自本地网络的入站网络连接。SSM代理轮询SSM服务,SSM服务负责将信息(如键盘输入)转发到实例。这意味着EC2 Mac实例只需有一个位于私有VPC中的私有IP地址,并且不需要通过安全组规则允许入站流量。2.不需要使用SSH密钥对来进行用户身份验证。用户可以使用IAM管理实例的连接访问权限。用户可以在IAM上设置允许或不允许某些亚马逊云科技用户或角色连接用户的实例。
在实例上运行的代理必须具有调用SSM API的权限。为了授予相关权限,用户可以创建一个IAM角色,为该角色添加权限,然后将该角色附到EC2实例上。用户可以使用IAM控制台或CLI来完成此操作。
以下教程中,其中一个CLI命令需要用户的EC2 Mac实例的ID。系统可以根据实例的名称搜索实例。
首先,创建一个适用于EC2实例的角色:
# First create the trust policy file
cat< ec2-role-trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
EOF
# Second, create role
aws iam create-role \
--role-name ssmAccess \
--assume-role-policy-document file://ec2-role-trust-policy.json
# Response
{
"Role": {
"Path": "/",
"RoleName": "ssmAccess",
"RoleId": "AROAXCTVZHOCU72YCLAQT",
"Arn": "arn:aws:iam::123456789012:role/ssmAccess",
"CreateDate": "2022-07-01T15:52:13+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
}
}
创建角色后,就需要为其添加权限。用户可以自定义权限策略,也可以使用亚马逊云科技提供的包含SSM完全权限的策略:arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore。此示例中,使用以下策略。
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore \
--role-name ssmAccess-Profile
接下来,将创建一个EC2实例配置文件,把角色附加到该配置文件,然后把该配置文件附加到EC2实例。
# Create an instance profile
aws iam create-instance-profile \
--instance-profile-name ssmAccess-Profile
# Response
{
"InstanceProfile": {
"Path": "/",
"InstanceProfileName": "ssmAccess-Profile",
"InstanceProfileId": "AIPAXCTVZHOC4QNUPTLZT",
"Arn": "arn:aws:iam::123456789012:instance-profile/ssmAccess-Profile",
"CreateDate": "2022-07-01T16:02:52+00:00",
"Roles": []
}
}
# Attach the role to the profile
aws iam add-role-to-instance-profile \
--instance-profile-name ssmAccess-Profile \
--role-name ssmAccess
# Search for my EC2 Mac Instance Id, search by name=macOS Monterey
INSTANCE_ID=$(aws ec2 describe-instances \
--filter "Name=tag:Name,Values=macOS Monterey" \
--query "Reservations[].Instances[?State.Name == 'running'].InstanceId[]" \
--output text)
# Associate the profile to the instance
aws ec2 associate-iam-instance-profile \
--instance-id $INSTANCE_ID \
--iam-instance-profile Name=" ssmAccess-Profile"
# Response
{
"IamInstanceProfileAssociation": {
"AssociationId": "iip-assoc-07d308386ff04f72d",
"InstanceId": "i-01e833b396e0cbf02",
"IamInstanceProfile": {
"Arn": "arn:aws:iam::123456789012:instance-profile/ssmAccess-Profile",
"Id": "AIPAXCTVZHOC4QNUPTLZT"
},
"State": "associating"
}
}
要签出示例项目,请前往building-rust-applications-for-aws-graviton,然后使用以下命令克隆该存储库:
过程有点长,但操作完成后,该EC2实例就可以访问SSM了。用户可以在启动实例时或实例启动后,将具有SSM访问权限的角色附加到EC2实例。将该角色附加到实例后,在这个macOS实例上运行的所有进程(包括SSM代理)都有权调用SSM API。
初始设置已经完成。下一步,连接实例。用户可以在亚马逊云科技控制台上或使用CLI来连接实例。
进入亚马逊云科技管理控制台,导航到EC2控制台,选择要连接的实例。然后点击Connect(连接)按钮。
在弹出的页面上,确认当前实例满足连接的前提条件,然后点击Connect(连接)。
当实例具有所需的权限时,浏览器中将打开一个黑色的界面。这是一个基于浏览器的shell连接,它连接的是用户的实例。
或者,用户可以使用CLI通过SSM进行连接。
用户需要安装Amazon CLI和相关插件。在本地计算机上,安装适用于Amazon CLI的SSM插件。
# Search for my EC2 Mac Instance Id, search by name=macOS Monterey
INSTANCE_ID=$(aws ec2 describe-instances \
--filter "Name=tag:Name,Values=macOS Monterey" \
--query "Reservations[].Instances[?State.Name == 'running'].InstanceId[]" \
--output text)
aws ssm start-session --target $INSTANCE_ID
然后,用户就可以连接Mac实例。用户可以运行下列命令来检查是否已连接实例:
Starting session with SessionId: sst-0a9c1047a20fdbd7c
sh-3.2$ uname -a
Darwin ip-172-31-32-67.us-east-2.compute.internal 21.4.0 Darwin Kernel Version 21.4.0: Fri Mar 18 00:45:05 PDT 2022; root:xnu-8020.101.4~15/RELEASE_X86_64 x86_64
sh-3.2$ diskutil list
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *121.3 GB disk0
/dev/disk1 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *214.7 GB disk1
1: EFI EFI 209.7 MB disk1s1
2: Apple_APFS Container disk2 214.5 GB disk1s2
/dev/disk2 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +214.5 GB disk2
Physical Store disk1s2
1: APFS Volume Macintosh HD - Data 48.3 GB disk2s1
2: APFS Volume Preboot 267.0 MB disk2s2
3: APFS Volume Recovery 1.1 GB disk2s3
4: APFS Volume Macintosh HD 15.2 GB disk2s4
5: APFS Snapshot com.apple.os.update-... 15.2 GB disk2s4s1
6: APFS Volume VM 20.5 KB disk2s6
sh-3.2$ id
uid=502(ssm-user) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),701(com.apple.sharepoint.group.1),100(_lpoperator)
若要结束SSH会话,请运行exit。
使用SSM时,用户将以ssm-user身份(而不是ec2-user)进行验证。这两个用户都包含在/etc/sudoers文件中。用户可以使用sudo命令将用户权限提升为root。该操作无需密码。