AWS Secret 无法转换为键名和值对

AWS Secret can't be converted into key names and value pairs

我有一个 python 脚本,可以在 AWS 中创建一些访问密钥并将它们存储在 secrets manager 中。

但是,当我存储密钥时,我收到一条错误消息:

The secret value can't be converted to key name and value pairs

秘密在秘密管理器中是这样存储的(混淆了秘密密钥):

[{'Access Key': 'AKIA5AODVC64THTZNML7'}, {'Secret Key': 'SecretSecretsecretSecretSecretSecretSecr'}]

我的脚本使用这些行来创建秘密:

secret_name = 'my_secret'
secret_description = 'describing the secret'
kms_key_id = create_kms_key()
key_info = str([{"Access Key":access_key},{"Secret Key":secret_key}])
aws_secret = `secrets_client.create_secret(Name=secret_name,Description=secret_description,KmsKeyId=kms_key_id,SecretString=key_info,Tags=[{'Key': 'Name','Value': user_name}])`

我如何才能将访问/秘密密钥转换为 secrets manager 足以转换为键/值对的格式?

首先,您应该重新考虑是否真的需要将 AWS 访问密钥存储在 Secrets Manager 中。您打算如何获取将用于调用 Secrets Manager 的凭据?

查看使用 temporary role creds,例如 - 不要使用您必须从 SecretsManager 获得另一个信用对的信用。使用你必须获得临时信用的信用。

关于您的实际问题,您似乎正在尝试在控制台中查看机密值(因为那是显示错误 "The secret value can't be converted to key name and value pairs" 的时间)。您用于创建机密的 python 代码片段工作正常。当控制台无法将 SecretString 解析为键值对时,将显示该错误。这是预期的行为,因为 SecretString 中的顶级 obj 是一个数组。

如果您单击红色错误显示框正上方的 "Plaintext" 选项卡,您将看到存储的 SecretString,而不会尝试解析成键值对。

首先,您可以将AWS Access Key和Secret Key存储在AWS Secret Manager中,但我强烈不建议。但我仍然可以提供一个解决方案来轻松做到这一点:

  1. 手动将您的秘密值放入 json 或使用 pysecret.
  2. 创建一个
from pysecret import AWSSecret

aws_profile = "my_aws_profile"
aws = AWSSecret(profile_name=aws_profile)

secret_id = "my-example-secret"
secret_data = {
    "iam_user_1": {
        "access_key": "AAAAAAAAAAAAAAAAAAAAA",
        "secret_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    },
    "iam_user_2": {
        "access_key": "BBBBBBBBBBBBBBBBBBBBB",
        "secret_key": "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
    }
}
aws.deploy_secret(name=secret_id, secret_data=secret_data) # or you can pass kms_key_id if you created a custom kms key
  1. 在 lambda 函数或任何 python 代码中读取您的秘密值
aws = AWSSecret(profile_name=aws_profile) # in lambda code, don't need ``profile_name=aws_profile``

access_key = aws.get_secret_value(secret_id="my-example-secret", key="iam_user_1.access_key") # AAAAAAAAAAAAAAAAAAAAA
secret_key = aws.get_secret_value(secret_id="my-example-secret", key="iam_user_1.secret_key") # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

access_key = aws.get_secret_value(secret_id="my-example-secret", key="iam_user_1.access_key") # BBBBBBBBBBBBBBBBBBBBB
secret_key = aws.get_secret_value(secret_id="my-example-secret", key="iam_user_1.secret_key") # YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

我创建了一个名为 pysecret 的开源库,这是 AWS Secret Manager 集成的文档:https://github.com/MacHu-GWU/pysecret-project#aws-key-management-service-and-secret-manager-integration

第二

当您想要创建 AWS 访问密钥对时,想想谁将使用它,人还是机器。如果是 Machine,请使用 IAM Role 而不是 IAM User。如果它是人类,人类应该负责安全地存储它,而不是 AWS Secret Manager。

希望这能回答您的问题。

通过添加 json.dumps 在文本值中发送 json 这对我有用:

import json
secret_name = 'my_secret'
secret_description = 'describing the secret'
kms_key_id = create_kms_key()
key_info = str(json.dumps([{"Access Key":access_key},{"Secret Key":secret_key}]))
aws_secret = `secrets_client.create_secret(Name=secret_name,Description=secret_description,KmsKeyId=kms_key_id,SecretString=key_info,Tags=[{'Key': 'Name','Value': user_name}])`