You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用role_arn替代密钥实现Lambda向DynamoDB/S3的boto3操作

实现AWS Lambda基于IAM角色访问DynamoDB和S3的完整方案

我明白你现在的困扰——硬编码密钥确实存在安全风险,换成IAM角色是非常正确的选择。下面我会一步步带你完成整个配置和代码修改的过程,确保你能顺利实现需求:

1. 创建具备所需权限的IAM角色

首先要为Lambda创建一个拥有DynamoDB写入、S3上传权限的IAM角色,同时要允许Lambda服务扮演这个角色:

  • 登录AWS控制台,进入IAM服务
  • 点击「角色」→「创建角色」
  • 选择「Lambda」作为受信任实体类型,点击「下一步」
  • 添加权限策略:
    • 如果你需要精细权限(推荐),可以自定义策略,比如仅允许对指定DynamoDB表执行PutItem、对指定S3桶执行PutObject,同时保留Lambda日志权限:
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "dynamodb:PutItem",
                  "Resource": "arn:aws:dynamodb:你的区域ID:你的AWS账号ID:table/你的DynamoDB表名"
              },
              {
                  "Effect": "Allow",
                  "Action": "s3:PutObject",
                  "Resource": "arn:aws:s3:::你的S3桶名/*"
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "logs:CreateLogGroup",
                      "logs:CreateLogStream",
                      "logs:PutLogEvents"
                  ],
                  "Resource": "arn:aws:logs:*:*:*"
              }
          ]
      }
      
    • 如果你只是快速测试,也可以直接勾选AmazonDynamoDBFullAccess和AmazonS3FullAccess(生产环境不推荐)
  • 给角色命名(比如Lambda-DynamoDB-S3-Access-Role),完成创建后记录下该角色的role_arn

2. 将IAM角色关联到Lambda函数

接下来要让你的Lambda函数使用这个角色来获取权限:

  • 进入Lambda控制台,找到目标函数
  • 切换到「配置」标签页→「权限」→「执行角色」→「编辑」
  • 选择「使用现有角色」,然后选中刚才创建的IAM角色,保存即可
  • 如果你是创建新Lambda函数,在创建页面的「执行角色」选项中直接指定该角色的ARN即可

3. 修改Lambda代码,移除硬编码密钥

原来的代码可能包含硬编码的Access Key和Secret Key,现在可以完全删除这些配置——boto3会自动通过Lambda的执行角色获取临时凭证:

旧代码(含硬编码密钥)

import boto3

dynamodb = boto3.resource('dynamodb',
    aws_access_key_id='YOUR_ACCESS_KEY',
    aws_secret_access_key='YOUR_SECRET_KEY',
    region_name='us-east-1')

s3 = boto3.client('s3',
    aws_access_key_id='YOUR_ACCESS_KEY',
    aws_secret_access_key='YOUR_SECRET_KEY')

新代码(基于IAM角色)

import boto3

# 无需指定密钥,boto3会自动读取Lambda执行角色的临时凭证
dynamodb = boto3.resource('dynamodb', region_name='你的区域ID')
s3 = boto3.client('s3')

# 向DynamoDB插入数据
table = dynamodb.Table('你的DynamoDB表名')
put_response = table.put_item(
    Item={
        'id': 'sample_001',
        'content': '通过IAM角色插入的测试数据'
    }
)

# 向S3上传文件(以临时文件为例)
with open('/tmp/upload_test.txt', 'rb') as file_obj:
    s3.put_object(
        Bucket='你的S3桶名',
        Key='test/upload_test.txt',
        Body=file_obj
    )

关键注意事项

  • Lambda执行时会自动从关联的IAM角色获取临时访问凭证,boto3的默认凭证链会自动识别并使用这些凭证,无需手动配置
  • 确保IAM角色的信任策略正确(创建角色时选择Lambda作为受信任实体会自动生成),策略内容类似:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    
  • 如果遇到权限错误,可查看Lambda的CloudWatch日志,里面会有明确的权限缺失提示,根据提示调整IAM策略即可

内容的提问来源于stack exchange,提问作者BharathKumarMurugan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:26:00