我正在使用無服務器框架創建一個將 CSV 保存到 S3 存盤桶的 lambda。
我已經有一個類似的 lambda 來用另一個桶來做這個。
這就是奇怪的地方:我可以將 CSV 上傳到我創建的第一個 S3 存盤桶(幾個月前),但是在將相同的 CSV 上傳到新的 S3 存盤桶時出現 AccessDenied 錯誤,就我而言可以告訴,通過 serverless.yml 配置以與第一個完全相同的方式創建。
錯誤是:
Error: AccessDenied: Access Denied
這些是 serverless.yml 中的相關部分:
provider:
name: aws
runtime: nodejs12.x
stage: ${opt:stage, 'dev'}
region: eu-west-1
environment:
BUCKET_NEW: ${self:custom.bucketNew}
BUCKET: ${self:custom.bucket}
iam:
role:
statements:
- Effect: 'Allow'
Action: 'lambda:InvokeFunction'
Resource: '*'
- Effect: 'Allow'
Action:
- 's3:GetObject'
- 's3:PutObject'
Resource:
- 'arn:aws:s3:::*' # Added this whilst debugging
- 'arn:aws:s3:::*/*' # Added this whilst debugging
- 'arn:aws:s3:::${self:custom.bucket}'
- 'arn:aws:s3:::${self:custom.bucket}/*'
- 'arn:aws:s3:::${self:custom.bucketNew}'
- 'arn:aws:s3:::${self:custom.bucketNew}/*'
functions:
uploadReport:
handler: services/uploadReport.handler
vpc:
securityGroupIds:
- 000001
subnetIds:
- subnet-00000A
- subnet-00000B
- subnet-00000C
resources:
Resources:
Bucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: ${self:custom.bucket}
BucketNew:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: ${self:custom.bucketNew}
custom:
stage: ${opt:stage, 'dev'}
bucket: ${self:service}-${self:custom.stage}-report
bucketNew: ${self:service}-${self:custom.stage}-report-new
Lambda 代碼(簡化):
const fs = require('fs')
const AWS = require('aws-sdk')
const S3 = new AWS.S3({
httpOptions: {
connectTimeout: 1000,
},
})
const uploadToS3 = (params) => new Promise((resolve, reject) => {
S3.putObject(params, err => (err ? reject(err) : resolve(params.Key)))
})
module.exports.handler = async () => {
const fileName = `report-new.csv`
const filePath = `/tmp/${fileName}`
// Some code that creates a CSV file at filePath.
const bucketParams = {
Bucket: process.env.BUCKET_NEW, // Works for process.env.BUCKET, but not process.env.BUCKET_NEW.
Key: fileName,
Body: fs.readFileSync(filePath).toString('utf-8'),
}
try {
const s3Upload = await uploadToS3(bucketParams)
} catch (e) {
throw new Error(e) // Throws Error: AccessDenied: Access Denied.
}
}
uj5u.com熱心網友回復:
我認為您可能缺少一些我經常在無服務器應用程式上使用“s3:Put*”的權限,這可能不明智,因為它太廣泛了。
這是上傳我在此處找到的物件所需的最低權限串列 我應該設定什么最低權限才能授予 S3 檔案上傳訪問權限?
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObjectAcl",
"s3:ListBucket",
"s3:GetBucketLocation"
uj5u.com熱心網友回復:
找到了解決方案,但這是我自己的錯誤。我的 lambda 實際上在 VPC 中。我的原始問題(編輯前)沒有顯示這一點。
VPC 中的 Lambda 無法與 S3 存盤桶通信,除非 VPC 具有使其能夠與任何特定參考的存盤桶通信的端點網關。
我之前創建了一個端點網關,讓它與我不久前創建的初始存盤桶通信,但忘記更新端點網關以讓它與新存盤桶通信。
除非其他人花一整天時間試圖解決一些愚蠢的問題,否則將這個答案留在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366646.html
