配置 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 SDK 和工具参考指南》中的配置

指定 AWS 区域

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

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

  • AWS_REGION 环境变量设置为默认区域。

  • 加载配置时,通过将 config.WithRegion 作为参数传递给 config.LoadDefaultConfig 来显式设置区域。

评论:如果您使用所有这些方法来设置区域,则 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

当您使用 config.LoadDefaultConfig 初始化 aws.Config 实例时,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. 任务 IAM 角色(如果您的应用程序使用 Amazon ECS 任务定义或 RunTask API 操作)。

  4. 适用于 Amazon EC2 的 IAM 角色(如果您的应用程序在 Amazon EC2 实例上运行)。

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

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

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

  2. 如果您的应用程序在 Amazon EC2 实例上运行,请使用适用于 Amazon EC2 的 IAM 角色。

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

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

    这些凭证和配置文件跨其他 AWS SDK 和 AWS CLI 进行共享。建议使用凭证文件来设置敏感值(例如访问密钥 ID 和密钥),这是安全最佳实践。这里有上述每个文件的格式要求

  4. 使用环境变量。

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

任务的 IAM 角色

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

适用于 Amazon EC2 实例的 IAM 角色

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

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

共享凭证和配置

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

您可以使用 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. 如果在同一凭证/配置文件中指定了重复的配置文件,则后一个配置文件中指定的配置文件属性优先。

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

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

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

创建凭证文件

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

[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 SDK 和工具参考指南中阅读更多内容。

创建配置文件

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

[default] region = <REGION>

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

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

[profile named-profile] region = <REGION>

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

指定配置文件

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

[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 允许您在加载共享配置源时提供显式 aws.CredentialProvider。要在加载共享配置时传递显式凭证提供程序,请使用 config.WithCredentialsProvider。例如,如果 customProvider 引用了 aws.CredentialProvider 实现的一个实例,则可在配置加载期间传递该实例,如下所示:

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

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

注意

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

静态凭证

您可以使用 credentials.NewStaticCredentialsProvider 凭证提供程序在应用程序中对凭证进行硬编码,以显式设置要使用的访问密钥。例如:

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

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

单点登录凭证

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

例如,您可以创建配置文件 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 CLI 以使用 AWS IAM Identity Center。有关以编程方式构造 SSO 凭证提供程序的更多信息,请参阅 ssocreds API 参考文档。

其他凭证提供程序

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

可用的凭证提供程序

  • ec2rolecreds – 通过 Amazon EC2 IMDS 从 Amazon EC2 实例角色中检索凭证。

  • endpointcreds – 从任意 HTTP 端点中检索凭证。

  • processcreds – 从将由主机环境的 shell 调用的外部进程中检索凭证。

  • stscreds – 从 AWS STS 中检索凭证