我正在处理一个使用 AWS Lambda 和 Node.js 的项目。我们将 Docker 容器用于我们的开发环境。
我们当前的设置在端口 :3000 上启动本地 AWS SAM。它运行 start-api 并将函数挂载到我的 template.yml 文件中。我使用邮递员测试这些功能以将 JSON 发送到已安装的 API 端点,如下所示:http : //127.0.0.1 : 3000/ foo
Docker 设置还在 :4000 上启动了一个单独的 Node.js 实例。
如上所述,我可以在本地测试 Lambda 内容。但是,我想激活调试,以便我可以单步执行该函数并检查变量,而不是使用console.log(). 我不知道如何编辑 Dockerfile / docker-compose.yml 来实现这一点。
这是我的 docker-compose 文件:
version: '3'
services:
web:
build: ./web
container_name: someapp
command: npm run dev
volumes:
- ./web:/usr/app/
- /usr/app/node_modules
ports:
- "4000:4000"
environment:
DATABASE_URL: mongo://someapp:someapp@10.10.62.205:37017,10.10.62.205:37018,10.10.62.205:37019/somedb
sam:
build: serverless/.
container_name: samlocal
command: sam local start-api --host 0.0.0.0 …Run Code Online (Sandbox Code Playgroud) amazon-web-services dockerfile aws-lambda docker-compose aws-sam-cli
我正在使用aws-sam-local来编写,测试和部署一些Lambda函数.
使用该-env-var选项我可以在本地测试时传递env.json,所以我的lambdas获取属性,我没有源代码控制.
如何发布这些值?aws-sam-local cli似乎位于主要aws cli的顶部,我看到一个--parameter-override选项,但只接受一个key = value字符串.
是否可以传递文件以覆盖?如果没有,我如何格式化不同lambda的env变量字符串?
谢谢
我运行此命令来部署我的lambda:
sam package --template-file prod_template.yaml --s3-bucket mybucket --output-template-file packaged-template.yaml
sam deploy --template-file packaged-template.yaml --stack-name mystack --capabilities CAPABILITY_IAM
Run Code Online (Sandbox Code Playgroud)
可以,但是此代码受版本控制,并且sam也上载.git文件夹。我如何让sam像使用gitignore一样忽略某些文件夹?
我正在评估无服务器 v AWS SAM CLI。我试图了解在使用以下内容进行开发时如何促进本地开发工作流程:-
我可以从文档中看到无服务器具有以下本地选项:-
如果有以下解决方案,则不明显:-
我可以从 SAM 文档中看到,可以针对本地 DynamoDB 测试 python Lambdas。不清楚还有什么可能,或者您是否必须将其指向一个实际的 AWS 实例(S3、SQS 等)
任何指针?
我正在努力让静态网站使用 CORS 调用 API 网关。我已经使用 SAM 本地运行了下面的代码,但是我在尝试从我的静态网站(本地托管)使用 jQuery 调用我的 API 时遇到以下 CORS 错误:
Failed to load http://localhost:3000/notify: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4000' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)
我的template.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Api:
# enable CORS; to make more specific, change the origin wildcard
# to a particular domain name, e.g. "'www.example.com'"
Cors: "'*'"
Parameters:
RecaptchaSecret:
Type: String
Resources:
NotifierFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: notifier/build
Handler: app.lambda_handler
Runtime: python3.6
Environment:
Variables: …Run Code Online (Sandbox Code Playgroud) cors aws-cloudformation aws-lambda aws-api-gateway aws-sam-cli
嗨,我有我的AWS Lambda,我想在上面添加一个图层。我希望能够仅测试lambda的单个方法。但是,他们中的许多人都使用层逻辑,因此在我看来这并不容易。最好的方法是什么?
一种方法是打包层,将主机放置在某个地方并将其用作依赖项。在那种情况下,为什么还要费心使用图层呢?
我的另一个想法是使用sam-cli在本地部署lambda。我知道如何使用它来测试整个lambda逻辑,但是我看不到如何分别对测试方法进行单元测试; /您的经验是什么?KR
编辑。我的解决方案
添加pytest
将所有测试放在test目录中
添加调用测试的测试lambda处理程序
import pytest
def lambda_handler(event, _):
res = pytest.main(['-x', './tests'])
return res
Resources:
MyFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: src/
Handler: test.lambda_handler
Runtime: python3.6
Events:
MyInfo:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /my-service/test
Method: get
Environment:
Variables:
ELASTICSEARCH_DOC_TYPE: "article"
ELASTICSEARCH_INDEX: "artilces"
ELASTICSEARCH_HOST: "elastic"
ELASTICSEARCH_PORT: "9200"
ELASTICSEARCH_URL: "http://my_elastic.com:9200"
Layers:
- arn:aws:lambda:eu-west-1:XXXXXXXXXXXXX:layer:lambda_layer:37
sam local invoke --no-event我刚刚开始使用SAM Local,但是在尝试为我的端点配置 Authorizer 功能时再次出现问题。
我一直在查看有关如何设置 Auth 函数的主要 SAM 文档,但是每当我尝试使用 本地运行 API 时sam local start-api,它运行良好,但好像它甚至没有尝试运行 auth 函数。
我已经尝试在 Global.API 中定义 Auth 以及在 SAM 的template.yaml的资源部分中定义一个 API 资源
# template.yaml
Globals:
Function:
Timeout: 3
CodeUri: src/
Runtime: nodejs8.10
Api:
Auth: # Option #1: Defining it globally
DefaultAuthorizer: CustomJWTAuthorizer
Authorizers:
CustomJWTAuthorizer:
FunctionArn: !GetAtt AuthFunction.Arn
Resources:
UserApi:
Auth: # Option #2: Defining it as an API resource
Authorizers:
MyLambdaTokenAuth:
FunctionPayloadType: TOKEN
FunctionArn: !GetAtt AuthFunction.Arn
DefaultAuthorizer: MyLambdaTokenAuth
GetUserFunction: …Run Code Online (Sandbox Code Playgroud) 随着最近发布的Lambda功能Docker 映像,我决定使用CloudFormation.
因此,下面的 lambda 考虑了存储在 中的 docker 图像Elastic Container Registry,并有权按照文档中的示例访问该图像。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: lambda-docker-image
Globals:
Function:
Timeout: 180
Resources:
DockerAsImage:
Type: AWS::Serverless::Function
Properties:
FunctionName: DockerAsImage
ImageUri: ??????????????.dkr.ecr.us-west-2.amazonaws.com/????:latest
PackageType: Image
Policies:
- Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- ecr:*
- ecr-public:*
- sts:GetServiceBearerToken
Resource: "*"
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: post
Run Code Online (Sandbox Code Playgroud)
我使用的是sam部署在模板us-west-2与
sam deploy -t template.yaml --capabilities "CAPABILITY_NAMED_IAM" --region "us-west-2" --stack-name "lambda-docker-example" …Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-ecs aws-cloudformation aws-lambda aws-sam-cli
我收到以下错误:
[ERROR] SSLError: SSL validation failed for https://data.iot.ap-northeast-2.amazonaws.com/topics/app%2Ftest%2Fresponse?qos=1 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1124)
Traceback (most recent call last):
File "/var/task/app.py", line 197, in lambda_handler
mqttcli.test('test', '11111', {}, 1, 200)
File "/opt/python/lib/python3.8/site-packages/connectors/MQTTClient.py", line 40, in test
response = self._iot_client.publish(
File "/var/task/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/task/botocore/client.py", line 662, in _make_api_call
http, parsed_response = self._make_request(
File "/var/task/botocore/client.py", line 682, in _make_request
return self._endpoint.make_request(operation_model, request_dict)
File "/var/task/botocore/endpoint.py", line 102, in make_request
return …Run Code Online (Sandbox Code Playgroud) 我正在使用 AWS SAM 构建无服务器应用程序
SAM + VSCode + Docker 桌面
一切工作正常,但是当我运行调试时突然开始出现超时错误。
注意:sam 本地调用(无需调试)工作正常。
当我运行调试模式(即 F5)时出现问题,它停止如下所示。这可能是网络问题吗?蟒蛇版本?之前调试是可以的。
另请注意:我有主机 Windows 10 计算机,我在主机内运行 Windows 10 VM (HyperV),其中我有这是开发环境设置。
以下是日志:
2021-05-20 11:43:48 [INFO]: Preparing to debug locally: Lambda "qa.lambdaHandler"
2021-05-20 11:43:48 [INFO]: Building SAM application...
2021-05-20 11:43:48 [INFO]: Running command: (not started) [C:\Program Files\Amazon\AWSSAMCLI\bin\sam.cmd build --build-dir C:\Users\PK\AppData\Local\Temp\aws-toolkit-vscode\vsctkzhq0Ca\output
--template C:/Users/PK/code/GCMS-AWS/publish-dynamodb/cmsqa/app___vsctk___template.yaml
--base-dir C:/Users/PK/code/GCMS-AWS/publish-dynamodb/cmsqa]
2021-05-20 11:43:50 [INFO]: Building codeuri: C:/Users/PK/code/GCMS-AWS/publish-dynamodb/cmsqa runtime: nodejs12.x metadata: {} functions: ['cmsqa']
2021-05-20 11:43:50 [INFO]: Running NodejsNpmBuilder:NpmPack
2021-05-20 11:44:02 [INFO]: Running NodejsNpmBuilder:CopyNpmrc
2021-05-20 11:44:02 [INFO]: …Run Code Online (Sandbox Code Playgroud) aws-sam-cli ×10
aws-lambda ×7
aws-sam ×3
amazon-ecs ×1
amazon-s3 ×1
boto3 ×1
cors ×1
dockerfile ×1
lambda ×1
localhost ×1
python ×1
serverless ×1