标签: serverless-application-model

由于配置错误,执行失败:Lambda 函数的权限无效

我正在通过 Visual Studio 使用 AWS Lambda 和 API Gateway 构建无服务器应用程序。我正在使用 C#,并使用无服务器应用程序模型 (SAM) 来部署我的 API。我在 Visual Studio 中构建代码,然后通过发布到 Lambda 进行部署。这是有效的,除了每次我进行新构建并尝试执行 API 调用时,我都会收到此错误:

由于配置错误,执行失败:Lambda 函数的权限无效

做了一些研究,我发现其他地方提到了这个修复(通过 AWS 控制台完成):

修复:转到 API 网关 > API 名称 > 资源 > 资源名称 > 方法 > 集成请求 > Lambda 函数并重新选择我现有的函数,然后用小复选标记“保存”它。

现在这对我有用,但它破坏了使用 serverless.template (JSON) 构建我的 API 的自动化。有谁知道如何在 serverless.template 文件中解决这个问题?这样我就不需要在控制台中采取行动来解决?这是 serverless.template 文件中我的一种方法的示例

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Transform" : "AWS::Serverless-2016-10-31",
  "Description" : "An AWS Serverless Application.",

  "Resources" : {

    "Get" : {
      "Type" : "AWS::Serverless::Function",
      "Properties": {
        "VpcConfig":{
          "SecurityGroupIds" : …
Run Code Online (Sandbox Code Playgroud)

aws-lambda aws-api-gateway serverless-application-model

28
推荐指数
4
解决办法
2万
查看次数

无法上传 HelloWorldFunction 资源的 CodeUri 参数引用的工件 None

我正在按照本教程学习如何使用SAM

这是我的代码:

模板.yml :

AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
Run Code Online (Sandbox Code Playgroud)

索引.js

exports.handler = async function(event, context) {
    return 'Hello World!';
};
Run Code Online (Sandbox Code Playgroud)

当我跑

sam package \
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket brian-test-sam
Run Code Online (Sandbox Code Playgroud)

我收到错误说 Unable to upload artifact None referenced by CodeUri parameter of HelloWorldFunction resource. An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

为什么会发生这种情况?

我已经brian-test-sam在我的 AWS 账户上创建了 S3 存储桶。我已经检查过我的 IAM 用户是否有AmazonS3FullAccess …

amazon-s3 amazon-web-services aws-cloudformation serverless-application-model

9
推荐指数
3
解决办法
9678
查看次数

我可以在 AWS Lambda 中指定 Node.js 命令行选项吗?

我正在使用 AWS SAM 并针对 Node 10.x 运行。

希望传递实验模块和顶级等待的标志。

谢谢!

aws-lambda serverless-application-model

8
推荐指数
1
解决办法
755
查看次数

使用IAM策略文档对象列表作为AWS :: Serverless ::功能策略

根据无服务器应用程序模型中的文档,AWS::Serverless::Function可以为Policies资源的属性指定IAM策略文档对象(PDO)的列表.

但是,当我尝试定义IAM PDO时,AWS Toolkit for Visual Studio正在标记语法错误: 在此输入图像描述

以下是我的Resources部分的完整示例:

"Resources": { "Example" : { "Type" : "AWS::Serverless::Function", "Properties": { "Handler": "Example::Example.Controllers.ExampleController::ExampleAction", "Runtime": "dotnetcore2.0", "CodeUri": "", "MemorySize": 256, "Timeout": 30, "Policies": [{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "*", "Resource": "*" } }], "Events": { "PutResource": { "Type": "Api", "Properties": { "Path": "/{id}", "Method": "GET" } } } } } }

有什么我错了,或者SAM或AWS Toolkit语法验证有问题吗?

amazon-web-services aws-serverless aws-visual-studio-toolkit serverless-application-model

6
推荐指数
1
解决办法
146
查看次数

使用 SAM 创建 API 网关代理资源

在 SAM(亚马逊的无服务器应用程序模型)中创建代理资源的要求显然很简单。事实上如此简单以至于亚马逊的文档似乎将其作为练习留给读者!

我想创建一个 AWS API Gateway 全能端点来将所有内容代理到另一个 HTTP 服务。

在 AWS 控制台中,我尝试构建的配置如下所示:

在此处输入图片说明

在此处看到了 Christian Johansen 的这篇优秀文章和他的相关 Stack Overflow 问题了解如何在 CloudFormation 中做同样的事情。我想我可以只在 SAM 中使用该代码,但是,SAM 具有其隐式和显式 API,因此如果“正确的方法”是引用隐式资源,我想避免创建显式资源。

有谁知道如何做到这一点?

amazon-web-services aws-serverless aws-sam serverless-application-model

6
推荐指数
1
解决办法
2653
查看次数

如何跨多个 SAM 模板共享单个 API 网关?

我一直在尝试跨多个 SAM 模板使用单个 APIGateway。为此,我尝试从其他 SAM 模板上的基本模板导入 RestApiId,并在 lambda 的事件部分下使用它。但 SAM 有限制说

RestApiId 必须是对同一模板中“AWS::Serverless::Api”资源的有效引用。

经过3个小时的研究,我了解到我们可以通过在基础模板中定义API网关并创建角色/策略/定义来实现它,以便允许调用所需的功能。将 Lambda 拆分为多个仅 Lambda 的 SAM 文件,但在其下不定义任何 Api 类型事件。这样,我们就可以创建彼此独立的 Lambda 和 API Gateway,并使用 Swagger/OpenAPI 进行集成并分别安排权限。

以下是推荐上述方法的有用链接。

链接1

链接2

我觉得这种方法有点复杂,如果 API 在 swagger 文件上得到更多,这可能会超出基本模板的 CFN 200 限制。如果有人建议一种更简单的方法来跨不同模板导入 apiGateway,我将不胜感激。

amazon-web-services aws-lambda aws-api-gateway api-gateway serverless-application-model

6
推荐指数
0
解决办法
1421
查看次数

Lambda 无法访问 KMS 密钥

当我运行我的 lambda 代码时,我收到以下错误:

The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.

我主要遵循使用 aws-sam-cli 创建堆栈,模板的相关部分在代码下方。

相关代码是:

const ssm = new AWS.SSM();
const param = {
    Name: "param1",
    WithDecryption: true
};
const secret = await ssm.getParameter(param).promise();
Run Code Online (Sandbox Code Playgroud)

template.yaml 文件的相关部分是:

KeyAlias:
    Type: AWS::KMS::Alias
    Properties:
      AliasName: 'param1Key'
      TargetKeyId: !Ref Key
Key:
    Type: AWS::KMS::Key
    Properties:
      KeyPolicy:
        Id: default
        Statement:
        - Effect: Allow
          Principal:
            AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
          Action: …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda aws-sam-cli aws-serverless serverless-application-model

5
推荐指数
1
解决办法
1万
查看次数

如何使用 yaml 格式文件在 serverless.yml 中编写嵌套 IF,同时将其用于云形成?

我试图在秘密管理器(创建的访问机密https://aws.amazon.com/secrets-manager/通过SSM(系统管理器- )https://docs.aws.amazon.com/systems-manager/latest /userguide/systems-manager-parameter-store.html ) 即 AWS 参数存储,并将其存储在serverless.yml文件中的自定义 YAML 变量中?我正在尝试通过无服务器框架(https://serverless.com/)实现云形成,并且我正在尝试在云形成中实现嵌套的 if 语句,以使用下面的代码实现上述内容。

 stage: &stage 'dev' #Hardcoded for now
 rdsMasterPassword:
 !If
  - !Equals [*stage,"prod"]
  - ${ssm:/aws/reference/secretsmanager/cred-prod~true:rdsMasterPassword}
  - !If 
      - !Equals [*stage,"staging"]
      - ${ssm:/aws/reference/secretsmanager/cred-staging~true:rdsMasterPassword}
      - ${ssm:/aws/reference/secretsmanager/cred-dev~true:rdsMasterPassword}
Run Code Online (Sandbox Code Playgroud)

我为此尝试了云形成内在函数 Fn::If ,但面临这个错误: Fn::If requires a list argument with the first element being a condition

yaml amazon-web-services aws-cloudformation serverless-framework serverless-application-model

5
推荐指数
1
解决办法
1872
查看次数

未找到共享 Nodejs 代码的 SAM Lambda Layer 模块

我在单个 template.yaml 中定义多个 lambda 函数。这些函数有一些通用代码,但没有发布模块。我以为我可以将这些常见的东西变成版本化层。加上一个目录效果如下:

  • 项目
    • LambdaFunc1
      • 包.json
      • 节点模块
      • func1.js
    • Lambda函数2
      • 包.json
      • 节点模块
      • func2.js
    • 常见的东西
      • 包.json
      • my-common.js
    • 模板.yaml
    • 节点模块

测试后,我将 common-stuff 复制到 Projects/node_modules 目录中,而我的其他 LambdaFuncs 根据 Node 向上移动未找到模块的目录结构来解析 require('common-stuff') 。

为了让 SAM 进行构建/打包/部署,我注意到 SAM 没有触及常见内容,而是使用其他两个 Lambda 函数创建了 .aws-sam/build 结构。我必须为 SAM 的 CodeURI 创建一个结构才能压缩。

Package/common-stuff/packaged/nodejs/node_modules/common-stuff/ 与我的 package.json 和 my-common.js。我的 package.json 使用名称:“common-stuff”,主要:“my-common.js”

没有其他文件——nodejs 下没有任何文件,因为我只打包模块。在我看来,这就是层的原因。我已经通过下载 Layer zip 文件验证了 SAM 打包了一个包含 nodejs/node_modules/common-stuff/... 的 zip 文件。

在 Lambda 函数模板 def 中,我添加了允许“lambda:GetLayerVersion”的权限。当我在控制台中查看 Lambda 函数时,我会看到此权限以及其他权限。

有趣的是,aws lambda get-layer-version-policy --layer-name MyLayer --version-number 8 --output text 返回没有附加策略的错误。我的猜测是,这是因为我已将其直接添加到函数中,正如我在 Lambda 函数上看到的那样,具有正确的Allow/GetLayerVersion。 …

layer amazon-web-services node.js aws-lambda serverless-application-model

5
推荐指数
0
解决办法
908
查看次数

如何将无服务器应用程序模型 (SAM) 模板转换为 Cloudformation?

这个答案我了解到 SAM 是 Cloudformation 的一种转换。

有没有办法通过控制台、CLI 或其他方式从 SAM 模板获取转换后的 Cloudformation 模板?

amazon-web-services aws-cloudformation aws-sam-cli aws-sam serverless-application-model

5
推荐指数
2
解决办法
1806
查看次数