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 用户

  1. 在 AWS 控制台中打开IAM 控制面板,然后点击 Users 标签页。

    AWS Add User

    然后,点击 Create User 并输入用户的名称。点击 Next

  2. Permissions options 部分,选择“Attach existing policies directly”。根据您是想要简化权限还是最小权限,按照以下说明操作

    搜索 AdministratorAccess 策略,然后勾选旁边的复选框以添加。点击 Next 继续。

    点击 Create Policy

    AWS Create Policy

    这将打开一个新窗口来定义最小策略。按照说明创建一个新策略:最小 IAM 策略

    回到此窗口,并在 Permissions policies 框中,点击刷新按钮。您现在可以搜索刚刚创建的策略。

    AWS Add Policy

    勾选旁边的复选框以添加策略,然后点击 Next 继续。

  3. 点击 Next 并按照说明创建用户。

  4. 从控制面板中选择新创建的用户,然后转到 Security credentials 标签页。点击 Create access key

    AWS Create access key
  5. 对于“Use case”,选择 Other。点击 Next,然后点击 Create access key

  6. 使用新创建的访问密钥通过 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 权限,您应该在两个地方设置最小权限

  1. 用户账户:用户账户是管理员创建的单个用户账户。

  2. IAM 角色:IAM 角色被分配给 SkyPilot 创建的所有 EC2 实例,这些实例使用该角色访问 AWS 资源,例如读写 S3 存储桶或创建其他 EC2 节点。IAM 角色由同一组织/根账户下的所有用户共享。(如果用户账户具有创建 IAM 角色的权限,SkyPilot 可以自动创建该角色。)

创建具有最小权限的用户账户#

按照上面关于专用 SkyPilot IAM 用户的说明操作。在为用户设置权限时,请使用下面的最小 IAM 策略规则。

为 SkyPilot 创建内部 IAM 角色#

注意

在大多数情况下,IAM 角色将自动创建。只有当您从最小 SkyPilot 策略中排除了可选的角色创建权限时,才需要手动创建 IAM 角色。

如果您的 AWS 账户中已存在名为 skypilot-v1 的 IAM 角色,它很可能是 SkyPilot 自动创建的,您可以跳过此部分。

  1. 如果您尚未这样做,请为 SkyPilot 创建一个最小 IAM 策略。如果您之前创建了具有最小权限的专用 IAM 用户,则可以重新使用为该专用用户使用的相同策略。

  2. IAM 控制面板中,转到“角色”(Roles) 标签页,然后点击 Create role

    AWS Add Role
  3. 选择信任的实体类型 (Trusted entity type):AWS 服务,以及使用场景 (Use case):EC2,如下图所示。

    AWS Role Entity, with "Trusted entity type" set to "AWS service", "Service or use case" set to "EC2", and "Use case" set to "EC2".

    点击 Next

  4. 搜索并选择步骤 1 中的 IAM 策略。

  5. 点击 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 显示的凭证不正确,您可以采取以下步骤进行故障排除

  1. 检查 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
    
  2. 检查 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 awsaws configure list 找不到凭证,则您可能没有设置默认配置文件。

    1. 如果设置了环境变量 AWS_PROFILE,将使用此配置文件名称。

    2. 如果存在名为 default 的配置文件,将使用它。

    3. 否则,该配置文件将无法访问。

    即使只有一个配置文件,除非设置了 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'