标签: aws-lambda

如何在 gitlab CI/CD 中使用 zappa 将应用程序部署到 AWS Lambda?

我正在尝试通过 gitlab CI 通过 zappa 在 aws lambda 上部署 Flask 应用程序。由于无法通过 gitlab CI 进行内联编辑,因此我zappa_settings.json在远程计算机上生成了该文件,并且尝试使用它来执行zappa deploy dev.

我的zappa_settings.json文件:

{
    "dev": {
        "app_function": "main.app",
        "aws_region": "eu-central-1",
        "profile_name": "default",
        "project_name": "prices-service-",
        "runtime": "python3.7",
        "s3_bucket": -MY_BUCKET_NAME-
    }
}
Run Code Online (Sandbox Code Playgroud)

我的.gitlab-ci.yml文件:

image: ubuntu:18.04

stages:
  - deploy

before_script:
  - apt-get -y update
  - apt-get -y install python3-pip python3.7 zip
  - python3.7 -m pip install --upgrade pip
  - python3.7 -V
  - pip3.7 install virtualenv zappa

deploy_job:
  stage: deploy
  script:
    - …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services zappa gitlab gitlab-ci aws-lambda

2
推荐指数
1
解决办法
1157
查看次数

VPC 中的 Lambda 无法访问互联网

我有一个位于 VPC 中的 lambda 函数,带有互联网网关。连接到 lambda 的安全组已打开所有入站和出站路由。路由表也被更新。lambda 仍然无法访问互联网。我错过了什么吗?

amazon-web-services aws-lambda

2
推荐指数
1
解决办法
2794
查看次数

调用 AWS Lambda Java 函数的 AWS 网关收到空正文

我正在使用 aws-lambda-java-events 库实现一个用 java 编码的 aws lambda 函数。为了进行故障排除,我现在只是尝试使用相同的请求正文进行响应

public class LambdaFunctionHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
        return new APIGatewayProxyResponseEvent().withBody(input.getBody());
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经定义了上面的 lambda 函数和 api 网关,但我得到的input.getBody是 null。lambda 函数的输出是一个空的 json 对象

{}
Run Code Online (Sandbox Code Playgroud)

我通过 AWS lambda 测试控制台对此进行了测试。执行成功,输出如上。api 网关集成请求配置为在 POST 方法上调用上述 lambda 函数。

以下是我的疑问

  1. 如何获取 aws 测试事件 json 作为APIGatewayProxyRequestEvent getBody()字符串的一部分?
  2. 如何获取APIGatewayProxyRequestEvent getBody()字符串变量中传递给 API Gateway POST 方法的请求正文?我需要定义映射模板吗?如果是这样,它应该是什么样子(我做了多次尝试但没有成功)

我想通过POSTMAN传递给API网关POST方法的请求体是

{
    "question":"Hello, how are you doing?"
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

java amazon-web-services aws-lambda aws-api-gateway

2
推荐指数
1
解决办法
5076
查看次数

AWS Cognito 与 ADFS:发行者与提供者名称不匹配

我正在尝试在无服务器 lambda(在 REST 端点中运行)中设置 AWS.config.credentials。登录来自使用 ADFS 作为联合身份的 Cognito 用户池。我还有一个 Cognito 身份池。

我的 lambda 处理程序具有如下所示的事件、上下文和回调参数:

    Exports.handler = (事件, 上下文, 回调) {
       ...
    }

event.headers.Authorization 具有一个有效的 JWT(来自 id_token),当在 HTML 客户端上执行对 REST 端点的 POST 调用时,该 JWT 被放置在 Authorization 标头中。我在这里亲自验证了 JWT: https: //jwt.io。此外, context.authorizer 对象看起来也有效,表明我已登录,它具有我的电子邮件和用户名信息以及有效的颁发和到期日期。简而言之,我很确定我已经获得了有效的登录信息。

但是,当我尝试执行以下命令时,出现错误“NotAuthorizedException:无效的登录令牌。颁发者与提供者名称不匹配”

    AWS.config.credentials = 新 AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'us-east-1:my-identity-pool-id',
        登录:{
          “cognito-idp:us-east-1.amazonaws.com/us-east-1_myUserPoolId”:event.headers.Authorization
        }
     });
     AWS.config.credentials.get(err => {
        如果(!错误){
          var id = AWS.config.credentials.identityId;
          console.log('Cognito 身份 ID '+ id);
        } 别的 {
          console.log('信用错误:', err);
        }
     });

当然,my-identity-pool-id 和 myUserPoolId 会替换为其实际值。我已经看到有关此主题的许多其他帖子表明错误制定的登录对象会产生此错误,但我已经在这段代码中多次讨论过这个问题 - 并让其他人也帮我检查过。我不认为我把那部分弄错了。就错误文本而言,它实际上是正确的。如果我查看解码后的 JWT,就会发现颁发者和提供者名称是不同的: …

amazon-cognito aws-lambda

2
推荐指数
1
解决办法
1861
查看次数

读取以 base64 形式接收的 CSV 文件的内容

我正在尝试读取作为 base64 字符串收到的 csv 文件,如下所示

csvBase64Content = "R2VuIERhdGUsR2VuIFRpbWUsTGlmdGluZyBEYXRlLExpZnRpbmcgVGltZSxUZXJtaW5hbCxTdXBwbGllck5vLFN1cHBsaWVyLExpZnRpbmcgU3RhcnQgVGltZSxDdXN0b21lck5vLEN1c3RvbWVyLEJPTCBOdW1iZXIsTW92ZW1lbnQgSUQsQ29udHJhY3QsQ2FycmllciBDb2RlLENhcnJpZXIgTmFtZSxQcm9kdWN0IENvZGUsUHJvZHVjdCBEZXNjcmlwdGlvbixHcm9zcyBMaXRyZXMsU3RkIExpdHJlcyxNdCBBaXIsTXQgVmFjLE0zLERlbnNpdHksQXYgVGVtcCxBZGRpdGl2ZSBHcm9zcyxEZXN0aW5hdGlvbiBOdW1iZXIsRGVzdGluYXRpb24gTmFtZSxDYXJkIFVzZWQsRHJpdmVyLER1dHkgU3RhdHVzDQoyNy8wNC8yMDIwLDA6MTY6MDEsMjYvMDQvMjAyMCw0OjI1OjU3LCBkdW1teSAyLDEsZHVtbXkgRnVlbHMgTGltaXRlZCw0OjE3OjA3LDIwMTQwNjE5NixDdXN0b21lcjEsMjY1NTgwLDQwMjUsMCw0NCxnTEVJRCwxNDEsRElFU0VMLDI3NDA1LDI3NTM2LDIzLDIzLDI3LDAuODM0Niw5LjM4LDAsMSxOVUxMLCwsMg0KMjcvMDQvMjAyMCwwOjE2OjAxLDI2LzA0LzIwMjAsNjo1MDowNiwgZHVtbXkgMiwxLGR1bW15IEZ1ZWxzIExpbWl0ZWQsNjozNjoyNiwxMDM0NTIsQ3VzdG9tZXIzLDI2NTQ4MSw5MjYsMCw0NCxnTEVJRCwyNSxVTFNHLDM1OTAxLDM2MDU5LDMwLjEsMzAuMSwzNiwwLjgzNDk3LDkuODMsMCwxLE5VTEwsLCwyDQoyNy8wNC8yMDIwLDA6MTY6MDEsMjYvMDQvMjAyMCw4OjU4OjQxLCBkdW1teSAyLDEsZHVtbXkgRnVlbHMgTGltaXRlZCw4OjU0OjIwLDIwMTIxMTMxMSxDdXN0b21lciAoU1BPVCkgLSAyMDEyLTExLTMxMSw0MDU0NDksNzI3NCwwLDQ3LFdJVCwyNSxVTFNHLDExOTk5LDEyMDM1LDEwLjEsMTAuMSwxMiwwLjgzNDk3LDExLjQyLDAsMSxOVUxMLCwsMg0KMjcvMDQvMjAyMCwwOjE2OjAxLDI2LzA0LzIwMjAsMTA6MzA6MDcsIGR1bW15IDIsMSxkdW1teSBGdWVscyBMaW1pdGVkLDEwOjI4OjE3LDIwMTIxMTMxMSxDdXN0b21lciAoU1BPVCkgLSAyMDEyLTExLTMxMSw0MDUzMjUsNzIyNiwwLDQ3LFdJVCwxNDEsRElFU0VMLDIwMDAsMjAwMywxLjcsMS43LDIsMC44MzQ2LDEzLjcsMCwxLE5VTEwsLCwyDQo="

decrypted = b64.b64decode(csvBase64Content)
with open(decrypted) as csvFile:
   #other stuff
Run Code Online (Sandbox Code Playgroud)

出现错误:

OSError: [Errno 22] Invalid argument:
Run Code Online (Sandbox Code Playgroud)

python python-3.x aws-lambda

2
推荐指数
1
解决办法
7994
查看次数

异步 for 循环不将 sqs 消息放入队列

我正在尝试在 Lambda 函数内部运行一个 for 循环,该循环将解析 SQS 消息并将其发送到某个队列。目前它正在运行 for 循环并正确创建参数(我通过日志记录检查),并且在 for 循环外部/之后运行一条日志消息,表示 lambda 已完成。

问题是 SQS 消息未发送和/或到达 SQS 队列。

我没有包含 lambda 函数的其余部分,因为它只是噪音,与问题无关,因为它已经正确运行,唯一的问题是 sqs 消息。

for (var i = 0; i < dogs.length; i++) {
      let MessageBody = JSON.stringify(dogs[i]);

            let params = {
                MessageBody,
                QueueUrl: process.env.serviceQueue,
                DelaySeconds: 0
            };
            sqs.sendMessage(params, function(err, data) {
                if (err) {
                    logger.error(`sqs.sendMessage: Error message: ${err}`);
                } else {
                    let stringData = JSON.stringify(data);
                    logger.info(`sqs.sendMessage: Data: ${stringData}`);
                }
            });
    }
Run Code Online (Sandbox Code Playgroud)

for-loop node.js aws-lambda

2
推荐指数
1
解决办法
1555
查看次数

AWS Lambda 函数 Boto 3 filter_log_events 无法使用 endTime 参数

我正在尝试从 Cloudwatch 日志中提取信息,以便根据指标从警报中发送更加自定义的电子邮件。我正在创建一个 lambda 函数来尝试在指定的时间范围内提取信息。但是,当我指定开始时间和结束时间时,响应中没有任何返回。我看过 Boto3 的文档,但没有说太多。我对 python 和 AWS 比较陌生,所以任何帮助都会很棒。代码示例如下:

import boto3
import json
import time
from datetime import datetime
from calendar import timegm

# Create CloudWatch client
clw = boto3.client('logs')


def lambda_handler(event, context):

    # User defined for testing purposes
    name = 'Error Log Metric'
    namespace = 'User Defined Metrics'

    response = clw.describe_metric_filters(metricName=name,
            metricNamespace=namespace)

    LogGroupName = response['metricFilters'][0]['logGroupName']
    FilterPattern = response['metricFilters'][0]['filterPattern']

    StartTime = timegm(time.strptime('2020-06-15T00:00:00.000Z',
                       '%Y-%m-%dT%H:%M:%S.%fZ'))
    EndTime = timegm(time.strptime('2020-06-16T23:59:59.000Z',
                     '%Y-%m-%dT%H:%M:%S.%fZ'))

    filteredLogs = clw.filter_log_events(logGroupName=LogGroupName,
            filterPattern=FilterPattern,
            logStreamNamePrefix='TEST_PREFIX_NAME',
            startTime=StartTime, endTime=EndTime)

    print(filteredLogs)
Run Code Online (Sandbox Code Playgroud)

回复

Response:
null …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services python-3.x boto3 aws-lambda amazon-cloudwatchlogs

2
推荐指数
1
解决办法
2845
查看次数

AWS Lambda - 如果 S3 中存在对象,则无法执行操作

我正在 NodeJs 中编写一个 lambda 函数,我想检查 S3 中是否存在文件。如果文件存在,我返回“A”,否则返回“B”。我正在使用 S3.HeadObject 来获取对象元数据作为承诺。

exports.handler = async (event, context, callback) => {
var params = {
    Bucket: "BucketName", 
    Key: "ObjectName"
};

const response = s3.headObject(params).promise();
Run Code Online (Sandbox Code Playgroud)

我能够得到响应,但无法检查文件是否存在。我首先尝试了 if/else 子句

 response.then(function(result) {
  const type = result['ContentType'];
  if(type == 'image/jpeg') {
      return "URL1"
  } else {
      return "URL2"
  }
}); 
Run Code Online (Sandbox Code Playgroud)

但是,我从未返回 URL1 或 URL2,lambda 返回 null。浏览了其他一些 SO 帖子,我发现了另一种方法:

s3.headObject(params, function(err, data) {
 if (err) {
  console.log(err, err.stack);
  return;
 }
 console.log(data)
});
Run Code Online (Sandbox Code Playgroud)

但是,这样我根本得不到任何回应。记录器不打印任何内容。

有人可以告诉我我做错了什么吗?我想根据 S3 中文件的可用性返回特定 URL。如果存在 JPG,则返回 JPG …

javascript amazon-s3 amazon-web-services node.js aws-lambda

2
推荐指数
1
解决办法
1040
查看次数

如何从 csv 插入到 dynamodb

Dynamo 数据库有一个表员工主键作为 id

csvdynamo下面是bucket中上传的data.csv

存储桶名称 = csvdynamo

id,name,co
20,AB,PC
21,CD,PC
22,EF,MC
23,GH,MC
Run Code Online (Sandbox Code Playgroud)

需要将以上csv插入dynamodb

伪代码

for emp in employees:
    emp_data= emp.split(',')
    print (emp_data)

    try:
        table.put_item(
            Item = {
                "emp_id": int(emp_data[0]),
                "Name": emp_data[1],
                "Company": emp_data[2]
            }
        )
    except Exception as e:
          pass
Run Code Online (Sandbox Code Playgroud)

python amazon-s3 aws-lambda

2
推荐指数
1
解决办法
9891
查看次数

api 网关 lambda 应如何返回用于登录的重定向 URL

我的 Lambda 函数返回 html 页面。我能够从 Node js 10.x 成功返回完整的 html。因此,如果我使用 api gateway url https://2kiz3ttah.execute-api.eu-west-1.amazonaws.com/stage/login访问我的 lambda ,如果未登录,则 lambda 应返回重定向 URL。如何返回在浏览器中打开的 URL,而不是呈现 HTML 页面。

amazon-web-services aws-lambda aws-api-gateway api-gateway

2
推荐指数
1
解决办法
5879
查看次数