【问题标题】:AWS Lambda S3.getObject throws "Access Denied", but only when running locallyAWS Lambda S3.getObject 抛出“拒绝访问”,但仅在本地运行时
【发布时间】:2021-06-10 16:31:57
【问题描述】:

我正在使用AWS Lambdaserverless 框架来构建一个使用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


    【解决方案1】:

    引用invoke-local的文档:

    当您使用无服务器调用本地时,情况完全不同:角色不可用(该功能在您的本地机器上执行),因此除非您直接在代码中设置不同的用户(或通过密钥对环境变量),AWS SDK 将使用您的 AWS 凭证配置文件中指定的默认配置文件。

    因此,对于本地调用,要么在 ~/.aws/credentials 中适当地配置本地 AWS 凭证,要么提供它们 via environment variables

    【讨论】:

    • 太好了,谢谢!它已经设置为[serverless] 密钥,[default] 密钥中的 buf,我有一个以前的帐户凭据...现在在本地也像魅力一样工作...
    猜你喜欢
    • 2016-09-29
    • 2021-06-27
    • 2020-12-26
    • 2020-09-30
    • 1970-01-01
    • 2018-02-07
    • 2020-03-28
    • 2022-11-11
    • 2018-09-14
    相关资源
    最近更新 更多