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

Python 如何(正确)在AWS Lambda函数中使用外部凭据?,python,amazon-web-services,aws-lambda,boto,amazon-iam,Python,Amazon Web Services,Aws Lambda,Boto,Amazon Iam,我有一个用Python编写的AWS lambda函数(非常基本,但工作正常),但它有嵌入的凭据可以连接到: 1) 外部web服务 2) 发电机桌 该函数所做的是相当基本的:它针对一个服务发布一个登录(使用凭据#1),然后将部分响应状态保存到DynamoDB表中(使用AWS凭据#2) 以下是该功能的相关部分: h = httplib2.Http() auth = base64.encodestring('myuser' + ':' + 'mysecretpassword') (response,

我有一个用Python编写的AWS lambda函数(非常基本,但工作正常),但它有嵌入的凭据可以连接到: 1) 外部web服务 2) 发电机桌

该函数所做的是相当基本的:它针对一个服务发布一个登录(使用凭据#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分钟运行一次(没有其他外部事件触发它)

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

conn = boto.connect_dynamodb()

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

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

  • AWS信条
  • 没有信用
  • 使用AWS creds,一切都很简单:创建IAM角色,将其许可给dynamodb,您就可以开始了

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

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

  • 这是清理dynamoDB访问凭据的正确答案。对于外部web服务,您需要将这些凭据存储在S3或DynamoDB之类的位置。对于所有AWS凭据,一定要使用与Lambda函数关联的IAM角色。对于运行时需要的其他机密,如外部服务的密码,我建议使用KMS。您可以在模块级别以KMS为单位对数据进行解密,因此您只需在模块初始化时(或当您的函数从冷->热转换时)支付费用。谢谢。这似乎是正确的做法。为lambda函数分配适当的IAM角色以访问DynamoDB是我考虑过的事情。问题的“没有AWS信用”部分是我没有弄明白的。谢谢