在AWS上玩一个小项目:

  • Golang应用程序
  • RDS/MySQL数据库
  • 秘密管理人
  • API网关和lambda

我正在本地运行Go应用程序来验证与数据库的交互,但我无法让它与秘密管理器一起工作.

使用以下示例代码:

func getCreds() {
    config, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
    if err != nil {
        log.Fatal(err)
    }

    svc := secretsmanager.NewFromConfig(config)
    input := &secretsmanager.GetSecretValueInput{
        SecretId:     aws.String(secretName),
        VersionStage: aws.String("AWSCURRENT"),
    }

    result, err := svc.GetSecretValue(context.TODO(), input)
    if err != nil {
        log.Fatal(err.Error())
    }

    var secretString string = *result.SecretString
    log.Printf("pwd: %s", secretString)
}

我得到了

operation error Secrets Manager: GetSecretValue, exceeded maximum number of attempts, 3, failed to sign request: failed to retrieve credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds

如果我理解正确,我需要向用户/策略添加权限.但在哪里添加这个呢?在IAM控制台中?还是秘密管理控制台?

那应该是什么呢?

{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Principal": {"AWS": "<what to add here>"},
            "Resource": "<and here>"
        }
    ]
}

推荐答案

Go应用程序找不到使用AWS API的凭据.

根据to (Configuring Credentials),您可以使用此代码在本地自动使用~/.aws/config作为凭据

sess := session.Must(session.NewSessionWithOptions(session.Options{
    SharedConfigState: session.SharedConfigEnable,
}))

如果您提供自定义配置,则必须提供凭据.还有其他的方法,挑一个适合你的.AWS proposes the method above.

这包括与您的用户一起运行.对于AWS执行,您需要授予Lambda函数访问密码的权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-west-2:111122223333:secret:aes128-1a2b3c"
            ]
        }
}

以上策略必须应用于执行Lambda时使用的IAM角色.您可以找到角色AWS控制台->您自己->配置->权限->执行角色

Go相关问答推荐

如何从google.golang.org/grpc/stats包中将golang中不同事件的输出进行组合,以获取func HandlePRC

+在具有html/模板Golang的Base64中

如何将GoFr筛选器用于查询参数?

埃拉托塞尼筛:加快交叉关闭倍数步骤

无法获取RPC描述符

如何模拟go的Elastic search SDK?

go aws-lambda 与 terraform 中的 exec 格式错误

如何使用 html/template 在 golang 中运行一个范围内的范围

生成一个 CSV/Excel,在 Golang 中该列的下拉选项中指定值

在 Go 中使用 Apache Arrow 按时间间隔对事件进行分区

如何从 Go 中的 `HijackedResponse` 中删除 Cursor Position ANSI 转义码?

使用图像解码 JPEG 时 colored颜色 不正确.解码并写入 PDF?

设置指向空接口的指针

Gorm 预加载给出了模糊的列错误

使用 `didip/tollbooth` 限制每小时最大请求数

在 Golang 中获取谷歌云服务帐户的访问令牌?

防止在 Go 公用文件夹中列出目录

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error

Go 赋值涉及到自定义类型的指针

即使没有竞争条件也没有得到任何输出