SharePoint上传文件时如何触发AWS Lambda同步至S3(事件驱动)?
方案一:通过Power Automate触发Lambda
这是最快速的实现方式,无需额外搭建中间服务:
- 创建Power Automate云流,触发规则选择「当文件创建或修改时(属性仅)」,绑定目标SharePoint站点和文档库
- 添加「获取文件内容」动作,拉取刚上传文件的二进制数据
- 配置AWS连接器(需提前关联AWS账号),添加「调用AWS Lambda」动作,传入文件名、文件内容等参数
- Lambda代码处理传入的文件内容并上传到S3,示例Python代码:
import boto3 import base64 s3 = boto3.client('s3') TARGET_BUCKET = 'your-bucket-name' def lambda_handler(event, context): file_name = event['FileName'] decoded_content = base64.b64decode(event['FileContent']) s3.put_object( Bucket=TARGET_BUCKET, Key=file_name, Body=decoded_content ) return {"statusCode": 200, "message": "Sync completed"}
- 权限配置:确保Lambda执行角色拥有
s3:PutObject权限,AWS连接器拥有调用该Lambda的权限
方案二:Microsoft Graph Webhooks + API Gateway触发Lambda
适合需要自定义事件处理逻辑的场景:
- 在Azure AD注册应用,获取
CLIENT_ID、CLIENT_SECRET、TENANT_ID,授予应用Sites.Read.All应用权限并完成管理员同意 - 通过Microsoft Graph API注册Webhook订阅,指定目标文档库的文件创建事件,回调URL设为AWS API Gateway的端点
- 配置API Gateway,将POST请求转发到Lambda,同时处理Webhook的验证请求(返回传入的
validationToken) - Lambda收到事件后,调用Graph API获取文件内容并上传到S3,示例核心代码:
import boto3 import requests import os s3 = boto3.client('s3') TARGET_BUCKET = 'your-bucket-name' GRAPH_TOKEN_URL = f"https://login.microsoftonline.com/{os.environ['TENANT_ID']}/oauth2/v2.0/token" def get_graph_token(): payload = { 'client_id': os.environ['CLIENT_ID'], 'client_secret': os.environ['CLIENT_SECRET'], 'scope': 'https://graph.microsoft.com/.default', 'grant_type': 'client_credentials' } res = requests.post(GRAPH_TOKEN_URL, data=payload) return res.json()['access_token'] def lambda_handler(event, context): # 处理Webhook验证 if 'validationToken' in event.get('queryStringParameters', {}): return { 'statusCode': 200, 'body': event['queryStringParameters']['validationToken'] } # 解析事件中的文件ID file_id = event['body']['value'][0]['resourceData']['id'] token = get_graph_token() # 获取文件内容 file_res = requests.get( f"https://graph.microsoft.com/v1.0/sites/root/drives/items/{file_id}/content", headers={'Authorization': f'Bearer {token}'} ) file_name = file_res.headers['Content-Disposition'].split('filename=')[1].strip('"') # 上传到S3 s3.put_object(Bucket=TARGET_BUCKET, Key=file_name, Body=file_res.content) return {"statusCode": 200, "message": "Sync completed"}
- 注意:Webhook订阅默认有效期3天,需在Lambda中添加续期逻辑;确保API Gateway配置正确的CORS规则
内容的提问来源于stack exchange,提问作者Riya Jain
相关产品推荐
相关产品推荐

