配置 SDK - 适用于 Go 的 AWS SDK v2

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 SDK

在 适用于 Go 的 AWS SDK V2 中,您可以为服务客户端配置常用设置,例如记录器、日志级别和重试配置。大多数设置都是可选的。但是,对于每个服务客户端,您都必须指定一个 AWS 区域和您的证书。SDK 使用这些值将请求发送到正确的区域,并使用正确的凭证对请求进行签名。您可以在代码中以编程方式指定这些值,也可以通过执行环境指定这些值。

加载 AWS 共享配置文件

有多种方法可以初始化服务 API 客户端,但下面这种是向用户推荐的最常见模式。

要将 SDK 配置为使用 AWS 共享配置文件,请使用以下代码:

import ( "context" "log" "github.com/aws/aws-sdk-go-v2/config" ) // ... cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { log.Fatalf("failed to load configuration, %v", err) }

config.LoadDefaultConfig(context.TODO())将使用 AWS 共享配置源构建 AWS.config。这包括配置凭证提供商、配置 AWS 区域和加载特定于服务的配置。可以使用加载的 aws.Config 来构造服务客户端,这为构造客户端提供了一致的模式。

有关 AWS 共享配置文件的更多信息,请参阅《 AWS SDKs 和工具参考指南》中的配置

指定 AWS 区域

指定区域时,您指定将请求发送到何处,例如 us-west-2us-east-2。要查看每项服务的区域列表,请参阅《 Amazon Web Services 一般参考》中的服务端点和配额

SDK 没有默认区域。指定一个区域:

评论:如果您使用所有这些方法来设置区域,则 SDK 将使用您显式指定的区域。

使用环境变量配置区域

Linux、macOS 或 Unix

export AWS_REGION=us-west-2

Windows

set AWS_REGION=us-west-2

以编程方式指定区域

cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-west-2"))

指定凭证

适用于 Go 的 AWS SDK 需要凭证(访问密钥和私有访问密钥)才能对请求进行签名 AWS。根据您的特定使用案例,您可以在多个位置指定凭证。有关获取凭证的信息,请参阅开始使用 适用于 Go 的 AWS SDK

当您使用初始化aws.Config实例时config.LoadDefaultConfig,SDK 会使用其默认凭证链来查找 AWS 凭证。此默认凭证链按以下顺序查找凭证:

  1. 环境变量。

    1. 静态凭证(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN

    2. Web 身份令牌(AWS_WEB_IDENTITY_TOKEN_FILE

  2. 共享配置文件。

    1. SDK 默认为计算机主文件夹中的 .aws 文件夹下的 credentials 文件。

    2. SDK 默认为计算机主文件夹中的 .aws 文件夹下的 config 文件。

  3. 如果您的应用程序使用 Amazon ECS 任务定义或 RunTask API 操作,则使用 IAM 角色执行任务。

  4. 如果您的应用程序在亚马逊 EC2 实例上运行,请为亚马逊担任 IAM 角色 EC2。

SDK 自动检测并使用内置提供程序,无需进行手动配置。例如,如果您对 Amazon EC2 实例使用 IAM 角色,则您的应用程序会自动使用该实例的证书。无需在应用程序中手动配置凭证。

作为最佳实践, AWS 建议您按以下顺序指定凭证:

  1. 如果您的应用程序使用 Amazon ECS 任务定义或 RunTask API 操作,请使用 IAM 角色执行任务。

  2. 使用适用于亚马逊的 IAM 角色 EC2 (如果您的应用程序在亚马逊 EC2 实例上运行)。

    IAM 角色为实例上的应用程序提供临时安全证书以进行 AWS 调用。IAM 角色提供了一种在多个 Amazon EC2 实例上分配和管理证书的简便方法。

  3. 使用共享凭证或配置文件。

    凭据和配置文件在其他 AWS SDKs 和之间共享 AWS CLI。作为安全最佳实践,我们建议使用凭证文件来设置敏感值,例如访问密钥 IDs 和密钥。这里有上述每个文件的格式要求

  4. 使用环境变量。

    如果您在 Amazon EC2 实例以外的计算机上进行开发工作,则设置环境变量非常有用。

任务的 IAM 角色

如果您的应用程序使用 Amazon ECS 任务定义或 RunTask 操作,请使用任务 IAM 角色指定任务中容器可以使用的 IAM 角色。

Amazon EC2 实例的 IAM 角色

如果您在 Amazon EC2 实例上运行应用程序,请使用该实例的 IAM 角色获取临时安全证书以进行调用 AWS。

如果您已将实例配置为使用 IAM 角色,则 SDK 会自动将这些凭证用于您的应用程序。您无需手动指定这些凭证。

共享凭证和配置

共享的凭据和配置文件可用于在其他工具 AWS SDKs 之间共享通用配置。如果您对不同的工具或应用程序使用不同的凭证,则可以使用配置文件在相同的配置文件中配置多个访问密钥。

您可以使用 config.LoadOptions 提供多个凭证或配置文件位置,默认情况下,SDK 会加载存储在指定凭证中提及的默认位置处的文件。

import ( "context" "github.com/aws/aws-sdk-go-v2/config" ) // ... cfg , err := config.LoadDefaultConfig(context.TODO(), config.WithSharedCredentialsFiles( []string{"test/credentials", "data/credentials"}, ), config.WithSharedConfigFiles( []string{"test/config", "data/config"}, ) )

使用共享凭证和配置文件时,如果指定了重复的配置文件,则会将其合并以解析一个配置文件。在发生合并冲突的情况下,

  1. 如果在同一个文件中指定了重复的配置 credentials/config 文件,则在后一个配置文件中指定的配置文件属性优先。

  2. 如果在多个凭证文件或多个配置文件中指定了重复的配置文件,则将按照 config.LoadOptions 的文件输入顺序解析配置文件属性。后面文件中的配置文件属性优先。

  3. 如果凭证文件和配置文件中都存在配置文件,则凭证文件属性优先。

如果需要,可以启用 config.LoadOptions 上的 LogConfigurationWarnings,并记录配置文件解析步骤。

创建凭证文件

如果没有共享凭证文件(.aws/credentials),可以使用任何文本编辑器在主目录中创建一个该文件。将以下内容添加到您的凭据文件中,用您的<YOUR_SECRET_ACCESS_KEY>凭据替换<YOUR_ACCESS_KEY_ID>和。

[default] aws_access_key_id = <YOUR_ACCESS_KEY_ID> aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>

[default] 标题定义了默认配置文件的凭证,除非您将其配置为使用其他配置文件,否则 SDK 将使用默认配置文件。

您也可以通过将会话令牌添加到配置文件来使用临时安全凭证,如以下示例所示:

[temp] aws_access_key_id = <YOUR_TEMP_ACCESS_KEY_ID> aws_secret_access_key = <YOUR_TEMP_SECRET_ACCESS_KEY> aws_session_token = <YOUR_SESSION_TOKEN>

凭证文件中非默认配置文件的部分名称不得以单词 profile 开头。您可以在AWS SDKs 和工具参考指南中阅读更多内容。

创建配置文件

如果没有共享凭证文件(.aws/config),可以使用任何文本编辑器在主目录中创建一个该文件。将以下内容添加到您的配置文件中,<REGION>替换为所需的区域。

[default] region = <REGION>

[default] 标题定义了默认配置文件的配置,除非您将其配置为使用其他配置文件,否则 SDK 将使用默认配置文件。

您可以使用命名配置文件,如以下示例所示:

[profile named-profile] region = <REGION>

配置文件中非默认配置文件的部分名称必须始终以单词 profile 开头,后跟预期的配置文件名称。您可以在AWS SDKs 和工具参考指南中阅读更多内容。

指定配置文件

您可以在同一配置文件中包含多个访问密钥,方法是将每组访问密钥与一个配置文件进行关联。例如,在凭证文件中,您可以声明多个配置文件,如下所示。

[default] aws_access_key_id = <YOUR_DEFAULT_ACCESS_KEY_ID> aws_secret_access_key = <YOUR_DEFAULT_SECRET_ACCESS_KEY> [test-account] aws_access_key_id = <YOUR_TEST_ACCESS_KEY_ID> aws_secret_access_key = <YOUR_TEST_SECRET_ACCESS_KEY> [prod-account] ; work profile aws_access_key_id = <YOUR_PROD_ACCESS_KEY_ID> aws_secret_access_key = <YOUR_PROD_SECRET_ACCESS_KEY>

默认情况下,开发工具包会检查 AWS_PROFILE 环境变量以确定使用哪些配置文件。如果未设置任何 AWS_PROFILE 变量,SDK 将使用 default 配置文件。

有时,您可能想在应用程序中使用不同的配置文件。例如,您想在 myapp 应用程序中使用 test-account 凭证。可以通过以下命令来使用此配置文件:

$ AWS_PROFILE=test-account myapp

您也可以指示 SDK 选择配置文件,方法是在调用 config.LoadDefaultConfig 之前调用 os.Setenv("AWS_PROFILE", "test-account"),或者将显式配置文件作为参数进行传递,如以下示例所示:

cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile("test-account"))
注意

如果在环境变量中指定凭证,则无论指定哪个配置文件,SDK 都将始终使用这些凭证。

环境变量

默认情况下,SDK 会检测您的环境中设置的 AWS 凭据,并使用这些凭据来签署对的请求 AWS。这样就无需管理应用程序中的凭证。

SDK 在以下环境变量中查找凭证:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN(可选)

以下示例演示了如何配置环境变量。

Linux、OS X 或 Unix

$ export AWS_ACCESS_KEY_ID=YOUR_AKID $ export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY $ export AWS_SESSION_TOKEN=TOKEN

Windows

> set AWS_ACCESS_KEY_ID=YOUR_AKID > set AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY > set AWS_SESSION_TOKEN=TOKEN

以编程方式指定凭证

config.LoadDefaultConfig允许您提供明确的 a ws。 CredentialProvider加载共享配置源时。要在加载共享配置时传递显式凭据提供程序,请使用 config。 WithCredentialsProvider。例如,如果 customProvider 引用了 aws.CredentialProvider 实现的一个实例,则可在配置加载期间传递该实例,如下所示:

cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithCredentialsProvider(customProvider))

如果您显式提供凭证(如本示例所示),SDK 将仅使用这些凭证。

注意

传递给或由其返回的所有凭证提供者LoadDefaultConfigCredentialsCache将自动封装在中。这使得缓存和凭证轮换具有并发安全性。如果您aws.Config直接在上显式配置提供程序,则还必须使用此类型显式包装提供程序NewCredentialsCache

静态凭证

您可以使用证书在应用程序中对凭据进行硬编码。 NewStaticCredentialsProvider凭据提供者,用于明确设置要使用的访问密钥。例如:

cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("AKID", "SECRET_KEY", "TOKEN")), )
警告

请勿将凭证嵌入到应用程序中。此方法只用于测试目的。

单点登录凭证

SDK 提供了一个凭据提供商,用于使用检索临时 AWS 证书。 AWS IAM Identity Center使用 AWS CLI,您可以通过 AWS 访问门户进行身份验证并授权访问临时 AWS 证书。然后,您将应用程序配置为加载单点登录 (SSO) 配置文件,然后 SDK 使用您的 SSO 凭证来检索临时证书,这些 AWS 证书将在过期后自动续订。如果您的 SSO 证书过期,则必须使用再次登录您的 IAM Identity Center 账户,从而明确续订证书。 AWS CLI

例如,您可以创建配置文件dev-profile,使用对该配置文件进行身份验证和授权 AWS CLI,并按如下所示配置您的应用程序。

  1. 首先创建 profilesso-session

[profile dev-profile] sso_session = dev-session sso_account_id = 012345678901 sso_role_name = Developer region = us-east-1 [sso-session dev-session] sso_region = us-west-2 sso_start_url = https://company-sso-portal.awsapps.com/start sso_registration_scopes = sso:account:access
  1. 使用登录 AWS CLI 以对 SSO 配置文件进行身份验证和授权。

$ aws --profile dev-profile sso login Attempting to automatically open the SSO authorization page in your default browser. If the browser does not open or you wish to use a different device to authorize this request, open the following URL: https://device.sso.us-west-2.amazonaws.com/ Then enter the code: ABCD-EFGH Successully logged into Start URL: https://company-sso-portal.awsapps.com/start
  1. 接下来,将应用程序配置为使用 SSO 配置文件。

import "github.com/aws/aws-sdk-go-v2/config" // ... cfg, err := config.LoadDefaultConfig( context.Background(), config.WithSharedConfigProfile("dev-profile"), ) if err != nil { return err }

有关配置 SSO 配置文件和使用进行身份验证的更多信息, AWS CLI 请参阅《 AWS CLI 用户指南》 AWS IAM Identity Center中的配置 AWS CLI 以使用。有关以编程方式构造 SSO 凭证提供程序的更多信息,请参阅 ssocreds API 参考文档。

登录凭证

您可以使用现有的 AWS 管理控制台登录凭据以编程方式访问 AWS 服务。在基于浏览器的身份验证流程之后, AWS 生成可在本地开发工具(如 CL AWS I 和)上使用的临时证书。 AWS Tools for PowerShell AWS SDKs此功能简化了配置和管理 AWS CLI 凭证的过程,尤其是在您更喜欢交互式身份验证而不是管理长期访问密钥的情况下。

  1. 使用 AWS CLI 启动登录流程,然后按照浏览器提示进行操作。在此示例中,我们将登录会话保存到新的配置文件dev-profile中,但这是可选的。

    $ aws --profile dev-profile login
  2. (可选)检查您的 AWS 共享配置文件以验证会话是否已建立。

    [profile dev-profile] login_session = arn:aws:sts::account id>:role
  3. 接下来,将您的应用程序配置为使用登录配置文件。

    import "github.com/aws/aws-sdk-go-v2/config" // ... cfg, err := config.LoadDefaultConfig( context.Background(), // only necessary if login session is saved to a non-default profile config.WithSharedConfigProfile("dev-profile"), ) if err != nil { return err }

有关配置登录配置文件和使用 AWS CLI 进行身份验证的更多信息,请参阅使用控制台凭据登录 AWS 本地开发

其他凭证提供程序

SDK 提供了其他方法,用于在凭证模块中检索凭证。例如,您可以从加密存储中检索临时安全证书 AWS Security Token Service 或从加密存储中检索证书。

可用的凭证提供程序