AWS Lambda PowerShell脚本如何通过OutFile参数将文件存到Amazon S3
问题核心原因
Invoke-RestMethod的OutFile参数仅支持写入本地文件系统路径,无法直接识别S3存储桶路径,你需要拆分「拉取文件」和「上传S3」两个步骤实现需求。
前置要求
- 你的Lambda执行角色必须配置包含
s3:PutObject权限的IAM策略,权限覆盖目标S3存储桶的对应路径 - Lambda运行环境默认预装AWS Tools for PowerShell的S3模块,可直接调用
Write-S3Objectcmdlet完成上传
方案1:先写入Lambda临时目录再上传(适合所有文件大小)
Lambda仅开放/tmp目录的写入权限,你可以先把文件拉取到临时目录,再上传到S3,代码示例:
# 定义临时本地路径 $localTempPath = "/tmp/<my file name>.txt" # 拉取文件存到本地临时路径 Invoke-RestMethod -Method Get -Uri $URI -Headers $Params -OutFile $localTempPath # 上传到S3 Write-S3Object -BucketName "<bucket name>" -Key "<directory name>/<my file name>.txt" -File $localTempPath
方案2:直接内存上传(适合小文件,避免磁盘IO)
如果拉取的文件体积较小,可以不写入本地磁盘,直接将拉取到的内存内容上传到S3:
# 直接拉取文件内容到内存 $fileContent = Invoke-RestMethod -Method Get -Uri $URI -Headers $Params # 内存内容直接上传S3 Write-S3Object -BucketName "<bucket name>" -Key "<directory name>/<my file name>.txt" -Content $fileContent
注意事项
- Lambda的
/tmp目录最大容量为512MB,如果你要拉取的文件超过这个体积,需要调整方案使用分段上传或者挂载EFS - 如果你拉取的是二进制文件,建议使用
Invoke-WebRequest代替Invoke-RestMethod,避免内容解析异常 - 使用
Invoke-WebRequest拉取文件时请加-UseBasicParsing参数,避免Lambda环境缺少IE组件导致的报错
内容的提问来源于stack exchange,提问作者Mike Goldweber
相关产品推荐
相关产品推荐

