【问题标题】:Accessing AWS APIs from within a lambda function?从 lambda 函数中访问 AWS API?
【发布时间】:2020-02-06 02:30:04
【问题描述】:

我正在编写我的第一个 lambda 函数(在 Python 中),我对凭据应该如何在 lambda 环境中工作感到有些困惑。我正在尝试从 aws secrets api 中检索一个秘密(用于 Aurora 数据库访问),使用看起来像这样的示例代码(为简洁起见,我删除了所有错误处理):

def get_secret():
    secret_name = 'dbtest-postgres-secret'
    region_name = 'us-east-2'

    session = boto3.session.Session()                                                                                                                                                          
    client = session.client(                                                                                                                                                                   
        service_name='secretsmanager',                                                                                                                                                         
        region_name=region_name                                                                                                                                                                
    )                                                                                                                                                                                          

    get_secret_value_response = client.get_secret_value(                                                                                                                                   
        SecretId=secret_name                                                                                                                                                               
    )                                                                                                                                                                                      

    secret = get_secret_value_response['SecretString']

    return secret

这在我拥有普通 AWS 凭证的环境中本地运行良好,但在作为 lambda 函数的一部分运行时返回 None 而不会引发任何错误。我是这样使用它的:

def handler(event, context):
    secret = get_secret()
    assert secret is not None

它在 assert 声明中失败了:

{
  "errorType": "AssertionError",
  "stackTrace": [
    "  File \"/var/task/dbtest.py\", line nn, in handler\n    assert secret is not None\n"
  ]
}

我假设通过将角色分配给具有适当权限的 lambda 函数(AmazonRDSDataFullAccess,其中包括访问机密管理器的权限),一切都会被设置。我是否需要向 lambda 函数提供明确的凭据(例如,访问密钥和秘密)?

【问题讨论】:

  • 我想知道为什么您没有看到 AccessDeniedError。

标签: python amazon-web-services aws-lambda aws-secrets-manager


【解决方案1】:

您不需要提供显式凭据,lambda 将从您分配给它的角色中获取凭据。你要的秘密是什么,因为AmazonRDSDataFullAccess 只能访问rds-db-credentials/* 的秘密。

【讨论】:

  • 秘密被称为“dbtest-postgres-secret”。你是说它的名字需要以rds-db-credentials/为前缀?
  • 没错。为了使该特定策略起作用,您需要这样做。如果您需要一组不同的秘密,您应该在您创建的策略中指定名称(或模式)。
  • 谢谢,就是这样!
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多