如何(正确)在AWS Lambda函数中使用外部凭据?

时间:2016-03-25 17:43:56

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

我有一个用Python编写的(非常基本但完美的)AWS lambda函数,但是它具有嵌入式连接到的凭据: 1)外部Web服务 2)DynamoDB表。

该功能的作用是相当基本的:它针对服务POST(登录凭证#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')

如果不在函数内部使用这些凭据,您将如何清理代码?

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

2 个答案:

答案 0 :(得分:8)

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

  1. AWS信誉
  2. 无AWS信誉
  3. 使用AWS信誉一切都很简单:创建IAM角色,赋予它对dynamodb的权限,然后你就可以了。

    对于非AWS信用,最安全的方法是:

    1. 使用kms服务预先加密凭据。 (kms.encrypt('foo')
    2. 您的信息加密版本。随意存放在任何你想要的地方。最简单的方法是在lambda中进行硬编码。
    3. 使用您在步骤1中使用的kms密钥为lambda IAM Role添加权限以解密信息。
    4. 然后每次调用lambda时,让它调用kms来解密信息。

答案 1 :(得分:4)

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

conn = boto.connect_dynamodb()

或者检查附加到您要提供给boto connect的用户的IAM策略。从该列表中选择并选择策略,并将这些权限授予LambdaExec角色。另请查看:Easy Authorization of AWS Lambda Functions