我应该如何将我的s3凭据传递给AWS上的Python lambda函数?

Dav*_*d A 4 python lambda amazon-s3 amazon-web-services aws-lambda

我想用我用Python编写的lambda函数将文件写入S3.但我很难通过我的S3 ID和密钥.

在我将本地Python环境变量AWS_SHARED_CREDENTIALS_FILE和AWS_CONFIG_FILE设置为指向我使用AWS CLI创建的本地文件之后,以下内容适用于我的本地计算机.

session = boto3.session.Session(region_name='us-east-2') 
s3 = session.client('s3', 
     config=boto3.session.Config(signature_version='s3v4'))
Run Code Online (Sandbox Code Playgroud)

以下是关于Lambda的工作,我手工编写我的ID和密钥(在这里使用***):

AWS_ACCESS_KEY_ID = '***'
AWS_SECRET_ACCESS_KEY = '***'
session = boto3.session.Session(region_name='us-east-2') 
s3 = session.client('s3', 
     config=boto3.session.Config(signature_version='s3v4'),
     aws_access_key_id=AWS_ACCESS_KEY_ID,
     aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
Run Code Online (Sandbox Code Playgroud)

但是我知道在阅读亚马逊的最佳实践后,这是不安全的.所以我尝试:

AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
session = boto3.session.Session(region_name='us-east-2') 
s3 = session.client('s3', 
     config=boto3.session.Config(signature_version='s3v4'),
     aws_access_key_id=AWS_ACCESS_KEY_ID,
     aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:"您提供的AWS Access密钥ID在我们的记录中不存在."我还尝试在Lambda控制台中定义这些变量,但我得到:"Lambda无法配置您的环境变量,因为您提供的环境变量包含保留键."

我有点惊讶我需要传递ID或密钥,因为我认为我创建Lambda函数的帐户也有权写入S3帐户(密钥和秘密我手工代码来自IAM同一帐户) .通过阅读以下帖子我有同感: AWS Lambda函数写入S3

Bra*_*ram 8

当您在另一个 AWS 资源中使用一个 AWS 资源时,您永远不需要使用 AWS 访问密钥。只需允许 Lambda 函数访问 S3 存储桶和您想要执行的任何操作(例如 PutObject)。如果您确保 Lambda 函数接收具有允许此类访问的策略的角色,则 SDK 将无需您进行所有身份验证。

如果您确实需要在 Lambda 中使用任何秘密密钥,例如 3rd 方系统或 AWS RDS 数据库(非 Aurora),您可能需要查看 AWS KMS。这与 Lambda 配合得很好。但同样:在 Lambda 中使用 S3 应该在 IAM 中使用正确的角色/策略来处理。


Enr*_*aez 5

您的帐户有权"写入"S3帐户的事实并不意味着您可以执行此操作.AWS有一项名为IAM的服务,它将处理您的lambda(在许多其他服务中)必须对其他AWS资源执行操作的权限.

很可能您缺少与lambda相关联的相关IAM角色/策略来写入S3存储桶.

正如AWS Lambda权限模型中所指出的,您需要在创建lambda时创建并关联IAM角色.您可以从控制台或使用CloudFormation执行此操作.

一旦您拥有适用于lambda的相关权限,您就不需要处理密钥或身份验证.