标签: aws-lambda

AWS VPC Lambda 函数不断失去互联网访问权限

希望有人可以帮助启发我解决这个问题。我目前正在研究一个 lambda 函数,它利用云监视调度程序来检查各种设备,并且它正在使用 elasticache 来维护一个简单的读数数据库。

我的问题是在我晚上关闭测试之后。我在早上启动了 lambda 函数,但该函数无法访问互联网。这由函数超时表示。经常在弄乱我的路线和我的 vpc 设置几个小时后,它会再次开始工作。只是为了第二天休息。有时它与 nat 网关一起使用,而其他时候只使用一个 nat 实例。我通常对 vpc 设置所做的更改很小。我使用的设置模式是一个公共、一个私有和一个 natgateway。

更新:昨天一整天都无法从我的 VPC 访问互联网后,今天运行正常。我做了什么不同的事情,没有。当它再次停止运行时,可能是今天晚些时候,我会打电话给 AWS,看看我们是否能找到问题的根源。

vpc amazon-web-services node.js amazon-elasticache aws-lambda

8
推荐指数
2
解决办法
1193
查看次数

DynamoDB 导致 Lambda 超时

我遇到了一个问题,即 Lambda 函数偶尔会超时,除了函数超时的通知之外,没有任何错误消息。

为了找到问题的根源,我在整个函数的各个点添加了日志记录,并确定一切正常,直到第一个 getItem() 请求从 DynamoDB 读取数据。读取似乎需要超过 3.00 秒的超时时间。

当然,我检查了我的 DynamoDB 表,看看是否有任何限制读取或错误。DynamoDB 的指标没有显示任何限制或错误,读取时间最多保持在两位数毫秒。

很明显,有什么地方出了问题,或者一路上掉了下来。我该如何解决这个问题,或者至少抓住它并重试读取?

这是一个面向 Web API 的读取功能,因此响应时间至关重要。因此,增加超时不会解决问题。

dynamodb.getItem({
  "TableName": "tablename",
  "Key": { "keyname": { "S": "keyvalue" } },
  "AttributesToGet": [ "attributeA", "attributeB" ]
}, function(err, data) {
  if(err){
    context.done(err);
  } else {
    if("Item" in data){
      nextFunction(event, context);
    } else {
      context.done("Invalid key");
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

没有限制读取

读取延迟似乎最小

node.js amazon-dynamodb aws-sdk aws-lambda

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

在本地运行 AWS SAM CLI 时启用 CORS

每当我尝试通过浏览器通过 POST 访问无服务器 lambda 函数时,我都会收到错误消息

对预检请求的响应未通过访问控制检查:请求的资源上不存在 >'Access-Control-Allow-Origin' 标头。

当它是一个/GET它工作正常我读过它是因为它没有发送飞行前请求。当我把它改成POST这个的时候就是失败了。

我正在运行的命令:

sam local start-api

我的 template.yaml 是:

...

Resources:
    PropertiesFunction:
        Type: AWS::Serverless::Function
        Properties:
            CodeUri: target/service-0.0.1-SNAPSHOT.jar
            Handler: com.aws.PropertiesHandler::handleRequest
            Runtime: java8
            Events:
                PropertiesApi:
                    Type: Api
                    Properties:
                        Path: /properties
                        Method: post

...
Run Code Online (Sandbox Code Playgroud)

如何在这些端点上启用 CORS?

amazon-web-services aws-lambda aws-api-gateway aws-sam-cli serverless

8
推荐指数
3
解决办法
4893
查看次数

如何在 webpack 编译期间禁止替换 process.env 变量?

故事

我正在开发 AWS Lambda 函数并使用webpack.

我已经阅读了一些文章,似乎process.env在编译期间变量会被自动替换。虽然很酷,但我想禁止这种行为。

为什么?

因为我使用 AWS Lambda 仪表板传递环境变量。

网络包配置

const nodeExternals = require('webpack-node-externals')
const webpack = require('webpack')
const path = require('path')

module.exports = {
  target: 'node',
  entry: path.resolve(__dirname, 'index.ts'),
  externals: [nodeExternals()],
  devtool: 'inline-source-map',
  mode: 'production',
  module: {
    rules: [{
      test: /\.tsx?$/,
      use: [{
        loader: 'ts-loader',
        options: {
          experimentalWatchApi: true,
        },
      }],
    }]
  },
  plugins: [],
  resolve: {
    extensions: ['.tsx', '.ts', '.js']
  },
  output: {
    filename: 'index.js',
    libraryTarget: 'commonjs',
    path: path.resolve(__dirname, 'dist')
  }
} …
Run Code Online (Sandbox Code Playgroud)

node.js typescript webpack aws-lambda webpack-4

8
推荐指数
2
解决办法
2028
查看次数

S3 托管 + Api 网关

我正在尝试在 S3 中托管一个静态站点,能够使用 Lambda/Api 网关处理一些动态内容。似乎无法做到这一点。我希望 URL 看起来像这样:

example.com/index.html
example.com/images/*
example.com/css/*
example.com/api/* -> API Gateway 
Run Code Online (Sandbox Code Playgroud)

另外,在重定向时,我想将 example.com 保留为根域。我在 S3 中尝试了 RoutingRules,但从客户端重定向。我需要这对用户透明,例如代理请求。

redirect amazon-s3 aws-lambda aws-api-gateway

8
推荐指数
2
解决办法
7982
查看次数

带有 .Net 核心的 AWS Lambda - 为 IOptions 启用注入?

我用 .net CORE 创建了一个空的 AWS Lambda 项目:

在此处输入图片说明

基本上它产生的是一个 .net 核心空 lambda 函数项目:

在此处输入图片说明

但就像现在一样 - 它不支持注入(DI),因为没有startup文件等......所以基本上它是 ia .net 核心项目,没有它的所有好处。

然而,托尼写道: Add .NET Core DI and Config Goodness to AWS Lambda Functions“:

基本上他所做的就是手动让项目支持DI。

所以我创建了一个ConfigurationService类:

配置服务.cs

 public interface IConfigurationService
    {
        IConfiguration GetConfiguration();
    }

    public class ConfigurationService : IConfigurationService
    {
        public IConfiguration GetConfiguration()
        {
            return new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后以常规方式在代码中使用它。

所以这里是与上面相同的函数从 appSettigs 返回一个键,PLUS (!!!) 依赖注入:

函数.cs

public class Function …
Run Code Online (Sandbox Code Playgroud)

c# amazon-web-services .net-core aws-lambda

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

AWS API Gateway Web Socket Api - 向所有连接的客户端广播消息

我已经使用 API Gateway 创建了一个 Web Socket Api,并且能够将客户端连接到它。

此外,我可以通过指定它ConnectionId并使用以下代码将消息发送到连接的客户端:

const AWS = require('aws-sdk');
let apiGatewayManagementApi = new AWS.ApiGatewayManagementApi({
  apiVersion: '2018-11-29',
  endpoint: 'https://XXXXXXXXX.execute-api.sa-east-1.amazonaws.com/dev/',
  region: 'sa-east-1'
});
const params = {
  ConnectionId: 'YYYYYYYYYYYYY',
  Data: 'test'
};
apiGatewayManagementApi.postToConnection(params, function (err, data) {
  if (err) {
    console.log(err, err.stack); // an error occurred
  } else {
    console.log(data);           // successful response
  }
});
Run Code Online (Sandbox Code Playgroud)

问题是我不需要区分客户端,所以我不想跟踪每个客户端的 ConnectionId,但是如果我在发送消息时删除它,我会收到以下错误: Missing required key 'ConnectionId' in params

有没有办法向所有连接的客户端发送消息(不指定任何 ConnectionId)?

javascript websocket aws-sdk aws-lambda aws-api-gateway

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

我是否必须在需要使用 npm 命令的 bitbucket 管道的每个步骤中进行 npm install

我有一个 bitbucket 管道 yml,我有运行测试脚本的步骤和运行无服务器部署脚本的步骤。我是否需要在每一步进行 npm install 或者第一个 npm install 是否会继续执行并足以满足后续的每个步骤。除此之外,引擎盖下发生了什么?我知道 Docker 容器已创建;每一步都只是更新容器吗?

- step:
        name: Test and Build
        script: 
          - npm install --no-package-lock
          - npm run test
    - step:
        name: Deploy Serverless
        script:
          - npm i serverless -g
          - npm install --no-package-lock
          - npm run deploy
Run Code Online (Sandbox Code Playgroud)

node.js npm docker aws-lambda bitbucket-pipelines

8
推荐指数
2
解决办法
4632
查看次数

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

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

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

谢谢!

aws-lambda serverless-application-model

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

AWS Lambda Python - 返回 BytesIO 文件?

我正在使用 python 3.7 在 AWS Lambda 中设置一个函数,它不会让我返回字节类型

请注意,这不是 API Gateway 的问题,我是直接调用 lambda 的。

错误是:Runtime.MarshalError, ... is not JSON serializable

output = BytesIO()
#Code that puts an excel file into output...
return {
        'Content-Disposition': 'attachment; filename="export.xlsx"',
        'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'body' : output.getvalue()
    }
Run Code Online (Sandbox Code Playgroud)

如果我做 :

'body' : str(output.getvalue())
Run Code Online (Sandbox Code Playgroud)

它输出损坏的文件,因为它添加b''到字符串

如果我做 :

'body' : base64.b64encode(output.getvalue()).decode()
Run Code Online (Sandbox Code Playgroud)

它还输出损坏的文件,可能是因为它更改了文件的二进制表示。

也许我需要上传到 S3?但它不适合我的流程,这是一次性文件创建,它会一直停留在“S3 Limbo”中,直到 TTL

amazon-web-services python-3.x aws-lambda serverless-framework

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