无法在本地和 lambda 上找到 boto3.client 的凭据

Posted

技术标签:

【中文标题】无法在本地和 lambda 上找到 boto3.client 的凭据【英文标题】:unable to locate credentials for boto3.client both locally, and on lambda 【发布时间】:2020-10-08 09:50:47 【问题描述】:

我的理解是,为了访问redshift等AWS应用,这样做的方式是

client = boto3.client("redshift", region_name="someRegion", aws_access_key_id="foo", aws_secret_access_key="bar")

response = client.describe_clusters(ClusterIdentifier="mycluster")

print(response)

此代码在本地通过 pycharm 以及在 AWS lambda 上运行良好。

但是,aws_access_key_idaws_secret_access_key 都来自我,我是否正确? IE:我的 IAM 用户安全访问密钥。应该是这样吗?还是我想创建一个不同的用户/角色以便通过boto3 访问redshift

更重要的问题是,如何正确存储和检索aws_access_key_idaws_secret_access_key?我知道这可以通过secrets manager 完成,但我仍然面临这样的问题,如果我运行以下代码,我会收到一条错误消息,提示它无法找到凭据。

client = boto3.client("secretsmanager", region_name="someRegion")
# Met with the problem that it is unable to locate my credentials. 

【问题讨论】:

【参考方案1】:

执行此操作的正确方法是创建一个允许所需红移功能的 IAM 角色,然后将该角色附加到您的 lambda。

创建角色时,您可以灵活地创建策略来细化对某些操作和/或某些资源的访问权限。

将 IAM 角色附加到您的 lambda 后,您将能够执行以下操作:

>>> client = boto3.client("redshift")

【讨论】:

【参考方案2】:

来自docs。由于您将凭据与代码混合在一起,因此第一个和第二个选项不安全。 如果代码在 AWS EC2 上运行,最好的方法是使用“担任角色”来授予 EC2 实例权限。如果代码在 AWS 之外运行,您必须选择一个选项,例如使用 ~/.aws/credentials

Boto3 在搜索凭据时会查找多个位置。 Boto3 查找凭据的机制是搜索可能位置的列表,并在找到凭据后立即停止。 Boto3 搜索凭据的顺序是:

在 boto.client() 方法中将凭据作为参数传递 在创建 Session 对象时将凭据作为参数传递 环境变量 共享凭据文件 (~/.aws/credentials) AWS 配置文件 (~/.aws/config) 担任角色提供者 Boto2 配置文件(/etc/boto.cfg 和 ~/.boto) 配置了 IAM 角色的 Amazon EC2 实例上的实例元数据服务。

【讨论】:

以上是关于无法在本地和 lambda 上找到 boto3.client 的凭据的主要内容,如果未能解决你的问题,请参考以下文章

无法让phantomjs在aws lambda上工作

Lambda 上的 MySQL 连接器产生无法导入模块“myapp”:没有名为“mysql”的模块

AWS Cloud9:在本地引用 Lambda 层

AWS Lambda 无法调用 Cognito Identity - IAM 角色

如何使用 NodeJS 在 AWS Lambda 上运行 PhantomJS

本地函数与 Lambda C# 7.0