AWS#
注意
默认情况下,SkyPilot 将使用您在本地设置的凭证。对于大多数情况,只需按照安装说明操作即可。以下步骤是可选的高级配置选项,主要面向云管理员和高级用户。
使用 AWS SSO#
支持 AWS IAM Identity Center(AWS 单点登录,即 SSO 的后继者)。
注意
如果您使用 AWS SSO 并涉及多个云,请查看SSO 多云兼容性说明。
要使用 SSO,请确保您的机器已安装 AWS CLI v2。默认情况下,pip install skypilot[aws]
安装 v1;v2 无法通过 pip 安装。要使用您新安装的 AWS v2 CLI,请使用 CLI 的绝对路径(默认情况下为 /usr/local/aws-cli/aws
)或创建别名 alias awsv2=/usr/local/aws-cli/aws
。
您可以使用以下命令检查版本
$ aws --version
aws-cli/2.25.6 ...
访问您的 SSO 登录门户(例如 https://my-sso-portal.awsapps.com/start
),然后在相应账户下点击 Access keys。在“AWS IAM Identity Center 凭证(推荐)”下,复制这些值
的
SSO start URL
的
SSO Region
然后,登录您的 SSO 账户
$ aws configure sso
SSO session name:应该设置,但您可以选择任何您想要的名称。
SSO start URL:从 SSO 登录门户复制
SSO region:从 SSO 登录门户复制
SSO registration scopes:留空以使用默认设置
在您的网页浏览器中登录并批准请求。然后回到 CLI 中,填写剩余字段
Default client Region:可选
CLI default output format:可选
Profile name:如果您想默认使用此配置文件与 SkyPilot,请设置为
default
,否则请参阅切换配置文件或账户。
如果一切设置正确,sky check aws
应该会成功!
使用 SSO 登录进行多云访问#
SSO 登录[1]跨多个云的功能有限。如果您使用多个云,可以设置一个专用的 IAM 用户和访问密钥,以便在其他云上启动的实例可以使用 AWS 资源。
支持的功能 |
SSO 凭证 |
静态凭证 |
---|---|---|
在 AWS 集群上使用 S3 存储桶 |
✅ |
✅ |
在另一个云的集群上使用 S3 存储桶 |
❌ |
✅ |
在多个云上运行托管作业 |
🟡 [1] |
✅ |
切换配置文件或账户#
您可以使用不同的 AWS 配置文件或账户来启动不同的集群。SkyPilot 将记住每个集群的所有者身份,并妥善保护任何“写入”操作。所有集群都会在 sky status
中显示。
混合使用默认配置文件和另一个配置文件的示例
$ # A cluster launched under the default AWS identity.
$ sky launch --cloud aws -c default
$ # A cluster launched under a different profile.
$ AWS_PROFILE=AdministratorAccess-12345 sky launch --cloud aws -c other-profile-cluster
如果您使用的是远程 API 服务器,则 AWS 凭证在远程服务器上配置。在客户端覆盖 AWS_PROFILE
不起作用。
使用特定的 VPC#
默认情况下,SkyPilot 在每个区域使用“默认”VPC。如果一个区域没有默认 VPC,SkyPilot 将无法使用该区域。
要指示 SkyPilot 使用特定的 VPC,您可以使用 SkyPilot 的全局配置文件 ~/.sky/config.yaml
,并在 aws.vpc_name
字段中指定 VPC 名称
aws:
vpc_name: my-vpc-name
详情请参阅高级配置。用例示例包括使用私有 VPC 或具有精细约束的 VPC,这些通常通过 Terraform 或手动创建。
要手动创建私有 VPC(即所有节点将仅拥有内部 IP),您可以使用 AWS 控制台;请参阅此处的说明。
专用的 SkyPilot IAM 用户#
您可以选择为 SkyPilot 创建一个专用的 IAM 用户并授予特定权限。创建专用用户不是必需的——只要您设置了 AWS CLI 凭证,SkyPilot 将自动使用这些凭证。
然而,使用专用的 IAM 用户可能带来一些好处
避免在 SkyPilot 中使用您的个人凭证。
指定最小权限以避免向 SkyPilot 授予广泛访问权限。
如果您使用 SSO 登录,可以启用一些额外的跨云功能。
按照以下步骤创建新的 AWS 用户
在 AWS 控制台中打开IAM 控制面板,然后点击 Users 标签页。
然后,点击 Create User 并输入用户的名称。点击 Next。
在 Permissions options 部分,选择“Attach existing policies directly”。根据您是想要简化权限还是最小权限,按照以下说明操作
搜索 AdministratorAccess 策略,然后勾选旁边的复选框以添加。点击 Next 继续。
点击 Create Policy。
这将打开一个新窗口来定义最小策略。按照说明创建一个新策略:最小 IAM 策略。
回到此窗口,并在 Permissions policies 框中,点击刷新按钮。您现在可以搜索刚刚创建的策略。
勾选旁边的复选框以添加策略,然后点击 Next 继续。
点击 Next 并按照说明创建用户。
从控制面板中选择新创建的用户,然后转到 Security credentials 标签页。点击 Create access key。
对于“Use case”,选择 Other。点击 Next,然后点击 Create access key。
使用新创建的访问密钥通过 AWS CLI 配置您的凭证
$ # Configure your AWS credentials $ aws configure AWS Access Key ID [None]: <Access key> AWS Secret Access Key [None]: <Secret access key> Default region name [None]: Default output format [None]: $ # Check that AWS sees the shared-credentials-files $ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************xxxx shared-credentials-file secret_key ****************xxxx shared-credentials-file region <not set> None None $ # Validate that credentials are working $ sky check aws -v
最小权限#
如果您想最小化 SkyPilot 使用的 AWS 权限,您应该在两个地方设置最小权限
用户账户:用户账户是管理员创建的单个用户账户。
IAM 角色:IAM 角色被分配给 SkyPilot 创建的所有 EC2 实例,这些实例使用该角色访问 AWS 资源,例如读写 S3 存储桶或创建其他 EC2 节点。IAM 角色由同一组织/根账户下的所有用户共享。(如果用户账户具有创建 IAM 角色的权限,SkyPilot 可以自动创建该角色。)
创建具有最小权限的用户账户#
按照上面关于专用 SkyPilot IAM 用户的说明操作。在为用户设置权限时,请使用下面的最小 IAM 策略规则。
为 SkyPilot 创建内部 IAM 角色#
注意
在大多数情况下,IAM 角色将自动创建。只有当您从最小 SkyPilot 策略中排除了可选的角色创建权限时,才需要手动创建 IAM 角色。
如果您的 AWS 账户中已存在名为 skypilot-v1
的 IAM 角色,它很可能是 SkyPilot 自动创建的,您可以跳过此部分。
如果您尚未这样做,请为 SkyPilot 创建一个最小 IAM 策略。如果您之前创建了具有最小权限的专用 IAM 用户,则可以重新使用为该专用用户使用的相同策略。
在IAM 控制面板中,转到“角色”(Roles) 标签页,然后点击 Create role。
选择信任的实体类型 (Trusted entity type):AWS 服务,以及使用场景 (Use case):EC2,如下图所示。
点击 Next。
搜索并选择步骤 1 中的 IAM 策略。
点击 Next,并将您的角色命名为
skypilot-v1
。点击 Create role。
最小 IAM 策略#
为了避免授予 SkyPilot 管理员访问权限,您可以创建一个限制账户权限的策略。
创建策略时,使用 JSON 策略编辑器。您可以复制最小策略规则和额外的可选策略规则。
这些是 SkyPilot 所需的最小策略规则
注意
将 <account-ID-without-hyphens>
替换为您的 AWS 账户 ID。您可以通过点击控制台右上角来查找您的 AWS 账户 ID。
注意
下面还有额外的可选规则。您很可能希望使用其中一些,请仔细查看。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*::image/ami-*"
},
{
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": [
"arn:aws:ec2:*:<account-ID-without-hyphens>:instance/*",
"arn:aws:ec2:*:<account-ID-without-hyphens>:network-interface/*",
"arn:aws:ec2:*:<account-ID-without-hyphens>:subnet/*",
"arn:aws:ec2:*:<account-ID-without-hyphens>:volume/*",
"arn:aws:ec2:*:<account-ID-without-hyphens>:security-group/*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:TerminateInstances",
"ec2:DeleteTags",
"ec2:StartInstances",
"ec2:CreateTags",
"ec2:StopInstances"
],
"Resource": "arn:aws:ec2:*:<account-ID-without-hyphens>:instance/*"
},
{
"Effect": "Allow",
"Action": [
"ec2:Describe*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:CreateSecurityGroup",
"ec2:AuthorizeSecurityGroupIngress"
],
"Resource": "arn:aws:ec2:*:<account-ID-without-hyphens>:*"
},
{
"Effect": "Allow",
"Action": "iam:CreateServiceLinkedRole",
"Resource": "*",
"Condition": {
"StringEquals": {
"iam:AWSServiceName": "spot.amazonaws.com"
}
}
},
{
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::<account-ID-without-hyphens>:role/skypilot-v1"
]
},
{
"Effect": "Allow",
"Action": [
"iam:GetInstanceProfile"
],
"Resource": "arn:aws:iam::<account-ID-without-hyphens>:instance-profile/skypilot-v1"
}
]
}
可选:如果您希望 SkyPilot 自动为 EC2 实例设置 IAM 角色和实例配置文件,请用高亮显示的四行修改策略中的最后两条规则
警告
如果您不这样做,则必须手动设置 SkyPilot 将使用的 IAM 角色:请参阅为 SkyPilot 创建内部 IAM 角色。
{
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:PassRole",
"iam:CreateRole",
"iam:AttachRolePolicy"
],
"Resource": [
"arn:aws:iam::<account-ID-without-hyphens>:role/skypilot-v1"
]
},
{
"Effect": "Allow",
"Action": [
"iam:GetInstanceProfile",
"iam:CreateInstanceProfile",
"iam:AddRoleToInstanceProfile"
],
"Resource": "arn:aws:iam::<account-ID-without-hyphens>:instance-profile/skypilot-v1"
}
可选:要启用 sky launch --clone-disk-from
,您还需要向上述策略添加以下权限。
{
"Effect": "Allow",
"Action": [
"ec2:CreateImage",
"ec2:CopyImage",
"ec2:DeregisterImage"
],
"Resource": "*"
}
可选:要在 AWS 集群上启用打开端口,您还需要向上述策略添加以下权限。
{
"Effect": "Allow",
"Action": [
"ec2:DeleteSecurityGroup",
"ec2:ModifyInstanceAttribute"
],
"Resource": "arn:aws:ec2:*:<account-ID-without-hyphens>:*"
}
可选:如果您希望用户访问 S3 存储桶,您还需要向上述策略添加以下权限。
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "*"
}
添加所有必需的策略后,点击 Next 并按照说明完成策略创建。您可以为策略指定一个描述性名称,例如 minimal-skypilot-policy
。
故障排除#
如果您的凭证未被 SkyPilot 识别,或者 SkyPilot 显示的凭证不正确,您可以采取以下步骤进行故障排除
检查
aws configure list
。此命令应显示当前配置的凭证。如果您已正确设置静态凭证,您应该会看到类似如下内容
$ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************xxxx shared-credentials-file secret_key ****************xxxx shared-credentials-file region <not set> None None
如果您已正确设置 SSO 凭证,您应该会看到类似如下内容
$ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************xxxx sso secret_key ****************xxxx sso region <not set> None None
检查
sky check aws
。这应该显示 SkyPilot 是否识别了凭证以及是否具有必要的权限。$ sky check aws -v Checking credentials to enable clouds for SkyPilot. AWS: enabled [compute, storage] Activated account: VRSC9IFFYQI7THCKR5UVC [account=190763068689] ...
常见问题#
启用了错误的配置文件。 如果设置了
AWS_PROFILE
环境变量,SkyPilot 将遵循该变量;请参阅切换配置文件或账户。如果未设置AWS_PROFILE
,SkyPilot 将使用名为default
的配置文件。您之前可能已在
.bashrc
文件或类似文件中设置了AWS_PROFILE
。请仔细检查该值$ # Check the account being used by skypilot $ sky check aws -v Checking credentials to enable clouds for SkyPilot. AWS: enabled [compute, storage] Activated account: XXXXXXXXXXXXXXXXXXXXX:user [account=123456789012] ... $ # AWS account 1234-5678-9012 is enabled via @user SSO login. $ # See the currently enabled profile. $ aws configure list Name Value Type Location ---- ----- ---- -------- profile AWSPowerUserAccess-123456789012 env ['AWS_DEFAULT_PROFILE', 'AWS_PROFILE'] access_key ****************xxxx sso secret_key ****************xxxx sso region <not set> None None $ # SSO profile AWSPowerUserAccess-123456789012 is enabled $ # via environment variable. $ # See details of the currently enabled AWS account and user/role. $ aws sts get-caller-identity $ # See if the environment variable has been set. $ echo $AWS_PROFILE AWSPowerUserAccess-123456789012 $ unset AWS_PROFILE $ # Delete from .bashrc/.zshrc to make the change permanent. $ # Now, default profile will be used. $ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None ... $ sky check aws -v Checking credentials to enable clouds for SkyPilot. AWS: enabled [compute, storage] Activated account: XXXXXXXXXXXXXXXXXXXXX [account=987654321098] ... $ # Now AWS account 9876-5432-1098 is enabled via default profile.
未设置配置文件。如果
sky check aws
和aws configure list
找不到凭证,则您可能没有设置默认配置文件。如果设置了环境变量
AWS_PROFILE
,将使用此配置文件名称。如果存在名为
default
的配置文件,将使用它。否则,该配置文件将无法访问。
即使只有一个配置文件,除非设置了
AWS_PROFILE
或配置文件命名为default
,否则它不会被使用。在 AWS CLI v1 中,您可以查看
~/.aws/credentials
和~/.aws/config
来查找配置文件名称。在 AWS CLI v2 中,您可以从 CLI 中检查。$ # AWS CLI v2 only $ aws --version aws-cli/2.25.6 ... $ # List all profiles $ aws configure list-profiles AWSPowerUserAccess-xxxxxxx default
如果没有
default
配置文件,您可以直接编辑配置# ~/.aws/config [profile default] sso_session = my-skypilot-session sso_account_id = XXXXXXXXXX ...
# ~/.aws/config [default] aws_access_key_id = XXXXXXXXXXXXXXXXXXXX aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
或者,您可以在您的 shell 配置中设置
AWS_PROFILE
环境变量# .bashrc / .zshrc # Enable AWS profile named "AWSPowerUserAccess-123456789012" export AWS_PROFILE='AWSPowerUserAccess-123456789012'