我正在通过 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) 这是我的代码:
模板.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
我正在使用 AWS SAM 并针对 Node 10.x 运行。
希望传递实验模块和顶级等待的标志。
谢谢!
根据无服务器应用程序模型中的文档,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
在 SAM(亚马逊的无服务器应用程序模型)中创建代理资源的要求显然很简单。事实上如此简单以至于亚马逊的文档似乎将其作为练习留给读者!
我想创建一个 AWS API Gateway 全能端点来将所有内容代理到另一个 HTTP 服务。
在 AWS 控制台中,我尝试构建的配置如下所示:
我在此处看到了 Christian Johansen 的这篇优秀文章和他的相关 Stack Overflow 问题,了解如何在 CloudFormation 中做同样的事情。我想我可以只在 SAM 中使用该代码,但是,SAM 具有其隐式和显式 API,因此如果“正确的方法”是引用隐式资源,我想避免创建显式资源。
有谁知道如何做到这一点?
amazon-web-services aws-serverless aws-sam serverless-application-model
我一直在尝试跨多个 SAM 模板使用单个 APIGateway。为此,我尝试从其他 SAM 模板上的基本模板导入 RestApiId,并在 lambda 的事件部分下使用它。但 SAM 有限制说
RestApiId 必须是对同一模板中“AWS::Serverless::Api”资源的有效引用。
经过3个小时的研究,我了解到我们可以通过在基础模板中定义API网关并创建角色/策略/定义来实现它,以便允许调用所需的功能。将 Lambda 拆分为多个仅 Lambda 的 SAM 文件,但在其下不定义任何 Api 类型事件。这样,我们就可以创建彼此独立的 Lambda 和 API Gateway,并使用 Swagger/OpenAPI 进行集成并分别安排权限。
以下是推荐上述方法的有用链接。
我觉得这种方法有点复杂,如果 API 在 swagger 文件上得到更多,这可能会超出基本模板的 CFN 200 限制。如果有人建议一种更简单的方法来跨不同模板导入 apiGateway,我将不胜感激。
amazon-web-services aws-lambda aws-api-gateway api-gateway serverless-application-model
当我运行我的 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
我试图在秘密管理器(创建的访问机密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
我在单个 template.yaml 中定义多个 lambda 函数。这些函数有一些通用代码,但没有发布模块。我以为我可以将这些常见的东西变成版本化层。加上一个目录效果如下:
测试后,我将 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
从这个答案我了解到 SAM 是 Cloudformation 的一种转换。
有没有办法通过控制台、CLI 或其他方式从 SAM 模板获取转换后的 Cloudformation 模板?
amazon-web-services aws-cloudformation aws-sam-cli aws-sam serverless-application-model
serverless-application-model ×10
aws-lambda ×5
aws-sam ×2
aws-sam-cli ×2
amazon-s3 ×1
api-gateway ×1
layer ×1
node.js ×1
yaml ×1