【问题标题】:How to (properly) use external credentials in an AWS Lambda function?如何(正确)在 AWS Lambda 函数中使用外部凭证?
【发布时间】:2016-07-13 12:14:26
【问题描述】:

我有一个用 Python 编写的(非常基本但运行良好的)AWS lambda 函数,但它嵌入了可连接到的凭据: 1) 外部网络服务 2) 一个 DynamoDB 表。

该函数的作用相当基本:它针对服务发布登录信息(使用凭证 #1),然后将部分响应状态保存到 DynamoDB 表中(使用 AWS 凭证 #2)。

这些是函数的相关部分:

h = httplib2.Http()
auth = base64.encodestring('myuser' + ':' + 'mysecretpassword')
(response, content) = h.request('https://vca.vmware.com/api/iam/login', 'POST', headers = {'Authorization':'Basic ' + auth,'Accept':'application/xml;version=5.7'})

然后

conn = boto.connect_dynamodb(aws_access_key_id='FAKEhhahahah',aws_secret_access_key='FAKEdhdhdudjjdjdjhdjjhdjdjjd')

您将如何通过在函数中不包含这些凭据来清理代码?

仅供参考,此功能计划每 5 分钟运行一次(没有其他外部事件触发它)。

【问题讨论】:

    标签: python amazon-web-services aws-lambda boto amazon-iam


    【解决方案1】:

    在您的示例中,您有两种类型的凭据:

    1. AWS 信誉
    2. 无 AWS 凭据

    有了 AWS 信任,一切都很简单:创建 IAM 角色,授予它对 dynamodb 的权限,然后一切顺利。

    使用非 AWS 凭据最安全的方法是:

    1. 使用 kms 服务预先加密凭证。 (kms.encrypt('foo'))
    2. 一旦您获得了信息的加密版本。随意将其存储在您想要的任何地方。最简单的方法是在 lambda 中对其进行硬编码。
    3. 向 lambda IAM 角色添加权限,以使用您在步骤 1 中使用的 kms 密钥解密信息。
    4. 然后每次调用 lambda 时,让它调用 kms 来解密信息。

    【讨论】:

    • 谢谢。这似乎确实是正确的方法。为 lambda 函数分配适当的 IAM 角色以访问 DynamoDB 是我曾经考虑过的事情。问题的“没有 AWS 信用”部分是我没有弄清楚的部分。谢谢。
    【解决方案2】:

    最简洁的方法是将DynamoDB 权限授予LambdaExec 角色。您的 boto 连接变为:

    conn = boto.connect_dynamodb()
    

    或者检查附加到您提供其信用以进行 boto connect 的用户的 IAM 策略。从该列表中挑选策略并将这些权限授予LambdaExec 角色。也可以看看:Easy Authorization of AWS Lambda Functions

    【讨论】:

    • 这是清理 dynamoDB 访问凭证的正确答案。对于外部 Web 服务,您需要将这些凭据存储在 S3 或 DynamoDB 等位置。
    • 绝对将与您的 Lambda 函数关联的 IAM 角色用于所有 AWS 凭证。对于运行时需要的其他机密,例如外部服务的密码,我建议使用 KMS。您可以在模块级别解密 KMS 中的数据,因此您只需在模块初始化时(或当您的函数从冷 -> 热转换时)支付费用。
    猜你喜欢
    • 2020-05-22
    • 2022-09-27
    • 1970-01-01
    • 2022-08-24
    • 2012-06-16
    • 2020-11-21
    • 2020-02-15
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多