我有两个关于 AWS SAM 和部署的问题。
\n我\xe2\x80\x99m 阅读文档并检查这样的示例,并且我\xe2\x80\x99m 仍然不太确定如何使用我的 SAM 模板单独部署到staging
和production
环境。是否像部署一个具有新名称(例如sam deploy \xe2\x80\x94stack-name my-app-staging
和 )的新堆栈一样简单sam deploy \xe2\x80\x94stack-name my-app-production
?
在下面的例子中,我有一个问题。如果我的 SAM 模板包含具有三个可能值的Parameters
名称MyEnvironment
,则部署如何知道在部署堆栈时使用这三个值中的哪个值?就像我会怎么说使用值staging
or production
?这是我部署时会自动询问的问题还是我必须在 CLI 上提供的问题?
我在 SAM/CloudFormation 模板中创建了一个 Step Function(父),它调用另一个 Step Function(子)。我正在按照使用服务集成模式从 Parent 调用 Child 的说明进行操作。但是我遇到了一个与 IAM 相关的(我认为)错误,我在通过 CLI 部署时无法解决。(错误显示在 CLI 输出中,因此它从未真正进入 AWS。之前有很多部署,因此changeset
只是尝试使用此部署修改 Step Function。)
'arn:aws:iam::{Account-Number}:role/{Parent-Step-Function-Role-Name}' is not authorized to create managed-rule. (Service: AWSStepFunctions; Status Code: 400; Error Code: AccessDeniedException; Request ID: {Long-Id-Number})
为了获得我想要的同步行为(父调用子,等待子的执行完成,然后移动到下一个状态)我使用建议(来自上面的服务集成模式链接)创建一个任务(在我的 SAM 模板中)如下所示:
...More States...
"Call Child State": {
"Type": "Task",
"Next": "The Next State",
"Resource": "arn:aws:states:::states:startExecution.sync",
"Parameters": {
"Input": {
"comment": "Hello World!"
},
"StateMachineArn": "${ChildStepFunction}",
"Name": "ChildExecutionFromParent"
}
},
...More States...
Run Code Online (Sandbox Code Playgroud)
我已经为 Parent 定义了 IAM …
amazon-web-services aws-cloudformation amazon-iam aws-step-functions aws-sam
我试图调用我的Lambda函数,sam local invoke
但发现它无法连接到我的主机MySQL.我尝试添加--docker-network host
但它也无法连接
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/docker/api/client.py", line 229, in _raise_for_status
response.raise_for_status()
File "/usr/lib/python3.6/site-packages/requests/models.py", line 935, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: http+docker://localhost/v1.35/networks/6ad3bd87e8437e8410145d169a4edf68d1b0247a67257ce7dd1208dac3664c82/connect
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/bin/sam", line 11, in <module>
load_entry_point('aws-sam-cli==0.5.0', 'console_scripts', 'sam')()
File "/usr/lib/python3.6/site-packages/click/core.py", line 722, in __call__
return self.main(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/click/core.py", line 697, in main
rv = self.invoke(ctx)
File …
Run Code Online (Sandbox Code Playgroud) I'm trying to enable CORS in my AWS SAM app. Here is the snippet from my template.yaml
:
Globals:
Api:
Cors:
AllowMethods: "'*'"
AllowHeaders: "'*'"
AllowOrigin: "'*'"
Resources:
MyApi:
Type: AWS::Serverless::Api
Properties:
StageName: prod
Auth:
Authorizers:
MyCognitoAuthorizer: ...
getByIdFunc:
Type: AWS::Serverless::Function
Properties:
Handler: src/handler.handle
Events:
ApiEvent:
Type: Api
Properties:
Path: /{id}
Method: GET
RestApiId: !Ref MyApi
Run Code Online (Sandbox Code Playgroud)
根据此Using CORS with AWS SAM和https://github.com/aws/serverless-application-model/issues/373,cors配置应该可以工作,但不幸的是API响应上没有设置标头,如下所示。
< HTTP/2 200
< content-type: application/json
< content-length: 770
< date: Tue, 13 Apr 2021 …
Run Code Online (Sandbox Code Playgroud) amazon-web-services cors aws-api-gateway aws-sam infrastructure-as-code
我目前正在致力于 AWS 无服务器 lambda 函数部署,并尝试使用 AWS SAM 进行分发和测试。但是,当我按照官方网站上的AWS SAM hello world模板教程进行操作时,我无法真正将代码部署到AWS。
我已经
然而,我收到了错误消息
错误:堆栈 aws-sam-cli-management-default 缺少标签和/或输出信息,因此不处于健康状态(当前状态:aws-sam-cli-management-default)。失败,因为堆栈可能不是由 AWS SAM CLI 创建的
我正在尝试使用通过 Homebrew 安装的 AWS SAM CLI,当我尝试将 sam 与任何命令一起使用时,我看到以下错误:
dyld: Library not loaded: @executable_path/../.Python
Referenced from: /usr/local/Cellar/aws-sam-cli/0.53.0/libexec/bin/python3.7
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
查看.Python
错误中引用的文件,它被符号链接到一个实际上不存在的 python 文件夹:
drwxr-xr-x 7 RCR staff 224 Jun 16 19:40 .
drwxr-xr-x 9 RCR staff 288 Jul 8 14:55 ..
lrwxr-xr-x 1 RCR staff 70 Jun 16 19:40 .Python -> ../../../../opt/python/Frameworks/Python.framework/Versions/3.7/Python
drwxr-xr-x 39 RCR staff 1248 Jul 8 14:55 bin
drwxr-xr-x 3 RCR staff 96 Jun 16 19:40 include
drwxr-xr-x 3 RCR staff 96 Jun 16 19:40 …
Run Code Online (Sandbox Code Playgroud) 我的目标是 尝试编写一个(单个)SAM 模板来获取由 Api 网关事件触发的 Lambda 函数。
我想要有多个 API 阶段(例如“dev”、“testing”、“prod”),并且希望每个阶段都映射到具有相同名称的 Lambda 别名。
我不想在每次部署时生成新的 lambda 版本,并且我喜欢手动设置每个 lambda 别名要使用的 lambda 版本。当然,“dev”别名意味着指向 $LATEST 代码版本。
我尝试了什么以及我得到了什么
我对经典的“hello_world”模板进行了如下修改。现在,当第一次部署(例如,“开发”)时,一切似乎都按预期工作。 但是,如果我尝试部署到“测试”阶段,则此新阶段的 API 会响应,而“开发”阶段的 API 将停止响应。
我缺少什么?
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
zzzz
Sample SAM Template for zzzz
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Parameters:
StageAliasName:
Description: stage / alias name to be used in this deploy
Type: String
AllowedValues:
- prod
- stage
- dev
- v1
Default: dev
Resources:
ApiGatewayApi: …
Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-lambda aws-sam-cli aws-serverless aws-sam
我想将我的 SAM 应用程序拆分为多个部分。
我想在根堆栈中创建一个 API ( AWS::Serverless::Api )。
我正在我的子堆栈中创建 lambda 函数,我想在其中提供从根堆栈到 API 事件的 API 引用。
这可行吗?我没有找到任何从根堆栈访问 API 到子堆栈的好例子?
我尝试使用以下模板 -
parenttemplateapi:
Type: AWS::Serverless::Application
Properties:
Location:
ApplicationId: arn:aws:serverlessrepo:us-east-1:account_id:applications/parent-template
SemanticVersion: 1.0.0
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python2.7
Events:
HelloWorld:
Type: Api
Properties:
Method: get
Path: /hello
RestApiId: !GetAtt parenttemplateapi.Outputs.ServerlessGW-restApiId
Run Code Online (Sandbox Code Playgroud)
当我尝试部署此模板时,出现以下错误 -
错误:无法为堆栈创建变更集:子模板,例如:Water ChangeSetCreateComplete 失败:Water 遇到终端故障状态状态:FAILED。原因:转换 AWS::Serverless-2016-10-31 失败:内部转换失败。
任何指示/建议?
我指的是以下链接 -
此处可以使用来自根堆栈的 API 网关 ID (AWS::ApiGateway::RestApi) 吗?
https://dev.to/grahamcox82/building-a-larger-serverless-application-part-3-modular-monorepos-3mon
这可以使用无服务器框架来实现吗?
amazon-web-services aws-cloudformation aws-api-gateway serverless-framework aws-sam
我在这里有些困惑,想看看是否有人能让我直截了当。
我正在将 Amplify 用于 Vue 应用程序。它调用调用 Lambda 的 API 网关,所有这些都是手动设置的,但我想使用 IaaS 的强大功能并使用 SAM 来完成。
Amplify CLI 包括添加 API/函数的能力,进而创建 CloudFormation 模板和堆栈,这很好。然而,这似乎并没有创建 Amplify 应用程序本身,除了创建一个连接到没有存储库的空应用程序,当然 CLI 只延伸到这么多服务。
我发现可以在 CloudFormation 中配置 Amplify 应用程序。SAM 附带的命令行工具也很有用。设置所有这些的正确方法是什么?
我能否为 Amplify 创建创建一个 SAM 模板,该模板与 Amplify 创建的堆栈配合使用以创建 API/函数,而不是在没有自动生成帮助的情况下手动构建 SAM 模板?然后,如果我稍后添加不支持 Amplify 的服务,我也可以将它们添加到 SAM。
我有时间尝试导航 SAM/CF/CDK/Amplify 哈哈
我在我的无服务器应用程序(避免混乱的最简单应用程序)中有一个类似于以下的目录结构,我使用 AWS SAM 和 Python 3.8 作为运行时创建了它:
??? common
? ??? a.py
??? hello_world
? ??? __init__.py
? ??? app.py
? ??? requirements.txt
??? template.yaml
Run Code Online (Sandbox Code Playgroud)
我想common/a.py
在 Lambda 处理程序中导入模块 - hello_world/app.py
。现在我知道我可以通过将路径添加到or来在 Python 中正常导入它,但是当代码在 Docker 容器内的 Lambda 中运行时它不起作用。调用时,Lambda 处理函数在目录内运行,不考虑文件夹结构。PYTHONPATH
sys.path
/var/task
我尝试插入/var/task/common
, /var/common
,/var
甚至像这样/common
以sys.path
编程方式插入:
import sys
sys.path.insert(0, '/var/task/common')
from common.a import Alpha
Run Code Online (Sandbox Code Playgroud)
但我仍然收到错误:
ModuleNotFoundError: No module named 'common'
我知道Lambda 层,但鉴于我的场景,我想直接引用多个 Lambda 函数中的公共代码,而无需上传到层。我想serverless-python-requirements
在无服务器框架中但在 …
aws-sam ×10
aws-sam-cli ×5
aws-lambda ×4
python ×2
amazon-iam ×1
aws-amplify ×1
cors ×1
docker ×1
homebrew ×1
python-3.x ×1