【发布时间】:2021-06-10 16:31:57
【问题描述】:
我正在使用AWS Lambda 和serverless 框架来构建一个使用S3 来存储文件的服务。
lambda 函数 ("hello") 在部署到云时运行良好(它有一个 http 端点,我从浏览器调用它)。
相反,当在本地调用时 (serverless invoke local --function hello) 我得到“拒绝访问”错误:
{
"errorMessage": "error getting object from S3: AccessDenied: Access Denied",
"errorType": "Error",
"stackTrace": [
"Error: error getting object from S3: AccessDenied: Access Denied",
" at module.exports.hello (/....js:24:9)",
" at processTicksAndRejections (internal/process/task_queues.js:93:5)"
]
}
这是我的简化函数:
'use strict';
const aws = require("aws-sdk");
const s3 = new aws.S3({ region: "eu-west-1" });
const bucket = "my-bucket-dev";
const key = "ads.json";
module.exports.hello = async (event) => {
let obj = null;
try {
return await s3.getObject({ Bucket: bucket, Key: key }).promise();
} catch(err) {
throw new Error(`error getting object from S3: ${err}`);
}
return {
statusCode: 200,
body: JSON.stringify({
message: `Hello function executed successfully!`,
obj,
input: event,
},
null,
2
),
};
}
这是我的 serveless.yml(相关部分):
service: my-service
frameworkVersion: '2'
provider:
name: aws
runtime: nodejs12.x
profile: serverless
lambdaHashingVersion: 20201221
apiGateway:
shouldStartNameWithService: true
stage: ${opt:stage, "dev"}
region: eu-west-1
iam:
role:
statements:
- Effect: "Allow"
Action:
- "s3:ListBucket"
Resource: { "Fn::Join": [ "", [ "arn:aws:s3:::", "my-service-dev" ] ] }
- Effect: "Allow"
Action:
- "s3:GetObject"
- "s3:PutObject"
- "s3:DeleteObject"
Resource: { "Fn::Join": [ "", [ "arn:aws:s3:::", "my-service-dev", "/*" ] ] }
functions:
hello:
handler: index.hello
events:
- http:
method: get
path: hello
- s3: my-bucket-dev
我确实在某处读到 IAM 角色声明对于本地和云执行不同,但如果它正确,我有点困惑...
谁能澄清一下?
我应该如何更正我的serverless.yml 以避免本地调用错误?
【问题讨论】:
标签: javascript node.js amazon-web-services serverless