Build - Main Branch Swift 5.7, 5.8 and 5.9 Tested Ubuntu 20.04 and 22.04 Tested CentOS 8 Tested Amazon Linux 2 Tested Join the Smoke Server Side community on gitter Apache 2

SmokeAWSCredentials

SmokeAWSCredentials 包是一个用于获取或承担短期轮换 AWS IAM 凭证的库,适用于从 https://github.com/amzn/smoke-aws 传递给客户端。

概念概述

此包提供了两种获取凭证的机制 -

入门指南

步骤 1:添加 SmokeAWSCredentials 依赖项

SmokeAWSCredentials 使用 Swift Package Manager。要使用该框架,请将以下依赖项添加到您的 Package.swift 中,并依赖于此包中的 SmokeAWSCredentials 目标 -

对于 swift-tools 版本 5.2 及更高版本 -

dependencies: [
    .package(url: "https://github.com/amzn/smoke-aws-credentials", from: "2.0.0")
]

.target(name: ..., dependencies: [
    ..., 
    .product(name: "SmokeAWSCredentials", package: "smoke-aws-credentials"),
]),

对于 swift-tools 版本 5.1 及更早版本 -

dependencies: [
    .package(url: "https://github.com/amzn/smoke-aws-credentials", from: "2.0.0")
]

.target(
    name: ...,
    dependencies: [..., "SmokeAWSCredentials"]),

步骤 2:从容器环境(例如 Elastic Container Service (ECS))获取凭证提供程序

一旦您的应用程序依赖于 SmokeAWSCredentials,您可以使用 AwsContainerRotatingCredentialsProvider 从容器环境(例如 Elastic Container Service (ECS))获取凭证。

guard let credentialsProvider = 
    AwsContainerRotatingCredentialsProvider.get() else {
        Log.error("Unable to obtain credentials from the container environment.")
        return
    }

返回的提供程序将管理短期凭证,并在需要时轮换它们。要获取当前的凭证 -

    let currentCredentials = credentialsProvider.credentials

返回的凭证在调用此方法时至少在 *5 分钟* 内有效。

当您不再需要这些凭证时,您可以停止后台凭证轮换。

    try await credentialsProvider.shutdown()

或者

    try credentialsProvider.syncShutdown()

步骤 3:使用现有凭证承担凭证

SmokeAWSCredentials 还允许您基于现有凭证承担短期凭证 - 可能是来自另一个帐户或具有不同权限的凭证。 以下 API 参考讨论了如何处理角色承担 -

    guard let assumedCredentials = credentialsProvider.getAssumedRotatingCredentials(
        roleArn: roleArn,
        roleSessionName: roleSessionName,
        durationSeconds: assumedRoleDurationSeconds) else {
            Log.error("Unable to obtain assume credentials for arn '\(roleArn)'.")
            return
    }

当您不再需要这些凭证时,您可以停止后台凭证轮换。

    credentialsProvider.stop()

注意: 如果您停止父凭证提供程序的轮换,由于父凭证无效,承担的凭证最终将无法轮换。

步骤 4:在开发中使用自定义凭证

您的开发环境可能不会像生产环境那样具有相同的可用凭证。 如果 AWS_SECRET_ACCESS_KEYAWS_ACCESS_KEY_ID 环境变量可用,则 AwsContainerRotatingCredentialsProvider 能够使用这些环境变量中的静态凭证。 对于静态凭证不可接受的情况,如果设置了 DEBUG 编译器标志和 AwsContainerRotatingCredentialsProvider.devIamRoleArnEnvironmentVariable 环境变量,此库将使用提供的角色调用以下 shell 脚本 -

此脚本可以使用此角色来获取凭证。 如果可以使用 ExpiringCredentials 结构对该脚本的输出进行 JSON 解码,则这些凭证将用于此提供程序。 如果脚本返回具有过期的凭证,则提供程序将管理轮换,并重新调用此脚本以更新凭证。

为方便起见,AwsContainerRotatingCredentialsProvider.get 可选择接受当前环境变量。

    #if DEBUG
    let environment = [...,
                       AwsContainerRotatingCredentialsProvider.devIamRoleArnEnvironmentVariable:
                           "arn:aws:iam::000000000000:role/EcsTaskExecutionRole"]
    #else
    let environment = ProcessInfo.processInfo.environment
    #endif
    
    guard let credentialsProvider = 
        AwsContainerRotatingCredentialsProvider.get(fromEnvironment: environment) else {
            return Log.error("Unable to obtain credentials from the container environment.")
    }

许可证

此库已获得 Apache 2.0 许可证的许可。