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

How to (properly) use external credentials in an AWS Lambda function?

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

该函数的作用相当基本:它针对服务发布登录(使用凭据 #1),然后将部分响应状态保存到 DynamoDB table(使用 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 分钟 运行(没有其他外部事件触发它)。

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

conn = boto.connect_dynamodb()

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

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

  1. AWS 积分
  2. None AWS 积分

有了 AWS creds,一切都变得简单了:创建 IAM 角色,授予它对 dynamodb 的权限,一切顺利。

对于非 AWS 凭证,最安全的方法是:

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