关于亚马逊网络服务:如何管理 AWS 密钥以进行本地开发

How to manage AWS Secret Keys for local development

我正在 Python 3.8 中编写一个 lambda 函数。该函数使用 boto3:

与 dynamodb 连接

1
db = boto3.resource('dynamodb', region_name='foo', aws_access_key_id='foo', aws_secret_access_key='foo')

这就是我在本地机器上开发并需要测试功能时所拥有的。但是,当我将它部署到 lambda 时,我可以删除凭证,如果我设置了正确的 IAM 角色和策略,我的函数将连接到 dynamodb。例如,此代码在部署到 lambda:

时可以正常工作

1
db = boto3.resource('dynamodb', region_name='foo')

问题是,在将代码推送到 lambda 方面,我该如何管理?我正在使用 AWS SAM 部署到 AWS。现在我所做的是,一旦我完成了我的功能开发,我手动删除 aws_access_key_id='foo'aws_secret_access_key='foo' 部分,然后使用 SAM 部署这些功能。

一定有更好的方法来做到这一点?我可以将这些嵌入到我的 IDE 中吗?我正在使用 PyCharm。那会是更好的方法吗?如果没有,还有什么?


你永远不应该在代码中这样放置凭据。

在本地运行代码时,使用 AWS CLI aws configure 命令将本地凭证存储在 ~/.aws/config 文件中。 AWS 开发工具包将自动查看该文件以获取凭证。


在 sam 中,您可以使用 sam local invoke 或 sam local start-lambda 在本地调用您的函数。

两者都取--profile参数:

The AWS credentials profile to use.

这将确保您的本地 lambda 环境使用正确的凭据执行,而无需在代码中硬编码它们。随后,您无需修改??即可测试您的代码,否则在对密钥 ID 和密钥进行硬编码时需要修改。


你可以使用环境变量。

环境变量既可以在 pycharm 中配置,也可以在 AWS Lambda 和 AWS SAM 中配置。

正如 Lambda 最佳实践中所述:"使用环境变量将操作参数传递给您的函数。例如,如果您正在写入 Amazon S3 存储桶,而不是硬编码您正在写入的存储桶名称,将存储桶名称配置为环境变量。"

您还可以使用环境变量来指定正在使用的环境,然后可以使用它来明确确定是否需要凭据。