标签: aws-lambda

AWS CDK 授予对堆栈外资源的权限

我对 AWS CDK 还很陌生,对 AWS 没有太多经验。在我正在编写的 CDK 堆栈中,我必须授予使用其他 CDK 模板构建并且已经在 aws 中的资源的权限。

假设我的堆栈 A 包含一个 lambda,该 lambda 将从另一个服务 X 调用。服务 X 需要具有 lambda 的调用权限。我可以从堆栈 A 代码中授予服务 X 权限,还是需要修改服务 X 堆栈?

amazon-web-services aws-lambda aws-cdk

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

AWS-Lambda:如何在 python 中处理 SNS 事件

如何从 SNS 事件中获取存储桶名称?

S3 存储桶将事件发布到 SNS 主题。本主题触发 Lambda。我需要 SNS,因为其他一些进程也监听这个事件。所以我不能直接从 S3 触发 Lambda。

在lambda函数,我得到两个参数:event和context 我需要得到桶名字出了大事。我期待做这样的事情:

bucket = event['Records'][0]['s3']['bucket']['name']
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为根据 Cloudwatch,事件参数如下所示:

{
    "Records":[
        {
            "EventSource":"aws:sns",
            "EventVersion":"1.0",
            "EventSubscriptionArn":"arn:aws:sns:eu-central-1:123456:sns-topic-dam-poc-new-import1:823baaf4-93b6-499a-944e-c99e1a6b1fb5",
            "Sns":{
                "Type":"Notification",
                "MessageId":"2330809c-29c4-5826-910d-d64a7ab22247",
                "TopicArn":"arn:aws:sns:eu-central-1:123456:sns-topic-dam-poc-new-import1",
                "Subject":"None",
                "Message":"{\\'Records\\': [{\\'EventSource\\': \\'aws:sns\\', \\'EventVersion\\': \\'1.0\\', \\'EventSubscriptionArn\\': \\'arn:aws:sns:eu-central-1:123456:sns-topic-dam-poc-new-import1:823baaf4-93b6-499a-944e-c99e1a6b1fb5\\', \\'Sns\\': {\\'Type\\': \\'Notification\\', \\'MessageId\\': \\'b611d3b2-a0d4-55fe-af0f-85648ffc2a59\\', \\'TopicArn\\': \\'arn:aws:sns:eu-central-1:123456:sns-topic-dam-poc-new-import1\\', \\'Subject\\': \\'None\\', \\'Message\\': \\'{\\n   \"Records\":[\\n      {\\n         \"EventSource\":\"aws:sns\",\\n         \"EventVersion\":\"1.0\",\\n         \"EventSubscriptionArn\":\"arn:aws:sns:eu-central-1:123456:sns-topic-dam-poc-new-import1:823baaf4-93b6-499a-944e-c99e1a6b1fb5\",\\n         \"Sns\":{\\n            \"Type\":\"Notification\",\\n            \"MessageId\":\"906fd69c-ee31-50f2-8b9d-804910f6fdcd\",\\n            \"TopicArn\":\"arn:aws:sns:eu-central-1:123456:sns-topic-dam-poc-new-import1\",\\n            \"Subject\":\"Amazon S3 Notification\",\\n            \"Message\":\"{\\\\\"Service\\\\\":\\\\\"Amazon S3\\\\\",\\\\\"Event\\\\\":\\\\\"s3:TestEvent\\\\\",\\\\\"Time\\\\\":\\\\\"2020-03-01T18:18:46.898Z\\\\\",\\\\\"Bucket\\\\\":\\\\\"s3-dam-poc-dev-inbox\\\\\",\\\\\"RequestId\\\\\":\\\\\"9534F72BD9216CA8\\\\\",\\\\\"HostId\\\\\":\\\\\"hSPdeBzns8wjrMHqkFJgw1UPMv0aZ/VOsAxw/z9wtboR+TOy8sKSKElDYxm9kszokgPsBU9T1nU=\\\\\"}\",\\n            \"Timestamp\":\"2020-03-01T18:18:47.036Z\",\\n            \"SignatureVersion\":\"1\",\\n            \"Signature\":\"FuoBKJczUXuKJ58d5SdddqnOjMwjxzG2aN+sef/0M5MFsAjRMyCNknvaXVVRrhujK39HouoOoDqyJNFzDWYR3WTYAM0Sqws9wJK9zBV9mxmMYdIurfDmVj4xsF4xuSeaMy4y/VfU2r75DxqhE3MPmA02IuGInGJsmw9CTk+Ao+kdnk/6rJT+Bt3EKK7uKj3kIWYehPDCYKYdzCsDcaP+Aaj2qEhEbkZxdaopB+pHRkMsLhZS/vHcc0Vd1eyZkRYHkxrG4FeKXVZdJT5OGuyixOSWq9YdCBJhWRnq7cRlQnk05WfswWdukOw9yjBkidsT1pJoiBQ==\",\\n            \"SigningCertUrl\":\"https://sns.eu-central-1.amazonaws.com/SimpleNotificationService-a86cb10b4e1f29c941702d7371d28f7b6.pem\",\\n            \"UnsubscribeUrl\":\"https://sns.eu-central-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-central-1:123456:sns-topic-dam-poc-new-import1:823baaf4-93b6-499a-944e-c99e1a6b1fb5\",\\n            \"MessageAttributes\":{\\n\\n            }\\n         }\\n      }\\n   ]\\n}\\', \\'Timestamp\\': \\'2020-03-01T21:45:12.192Z\\', \\'SignatureVersion\\': \\'1\\', \\'Signature\\': …
Run Code Online (Sandbox Code Playgroud)

python amazon-s3 amazon-web-services amazon-sns aws-lambda

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

一次使用单独的 Lambda 处理 AWS SQS 消息

就像标题所暗示的那样,我有一个想探索但不知道如何去做的场景。

我有一个 lambda 函数processCSVFile。我还有一个 SQS 队列,在每天的固定时间,它会填充来自 S3 的 csv 文件链接,比如说大约 2000 条消息。现在,一旦 SQS 队列有消息,我想一次处理 25 条消息。

我正在寻找的场景是同时处理 25 条消息,我希望这 25 条消息分别由 25 个 lambda 调用处理。我以为我可以SendMessageBatch在 SQS 中使用函数,但这只会将消息传递到队列,它似乎不适用于我的用例。

我的问题是,我是否能够执行上述操作,如果可能,哪些文档或用例可以解释我正在寻找的内容。另外,如果这个用例是不可能的,你有什么推荐的替代方法来完成我想要同时完成的处理。

amazon-sqs amazon-web-services aws-lambda

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

aws lambda - 找不到 libmagic

我在我的 lambda 函数中使用魔法库来确定文件的类型。我首先将它部署到本地容器以检查一切是否正常。

我的 DockerFile :

FROM lambci/lambda:build-python3.8
WORKDIR /app
RUN mkdir -p .aws
COPY requirements.txt ./
COPY credentials /app/.aws/
RUN mv /app/.aws/ ~/.aws/
RUN pip install --no-cache-dir  -r requirements.txt
RUN pip install --no-cache-dir  -r requirements.txt -t "/app/dependencies/"
WORKDIR /app/dependencies
RUN zip -r  lambda.zip *
Run Code Online (Sandbox Code Playgroud)

要求.txt:

python-magic
libmagic
Run Code Online (Sandbox Code Playgroud)

在我的本地容器中,当我对 lambda 逻辑运行测试时,一切正常并通过(包括使用魔术代码的部分..)。

我创建了一个包含 lambda.py 代码和 python 依赖项(docker 文件中的最后 3 行)的 zip。当我将 zip 上传到 aws 并测试 lambda 时,出现以下错误:

{
  "errorMessage": "Unable to import module 'lambda': failed to find libmagic.  Check your installation", …
Run Code Online (Sandbox Code Playgroud)

python amazon-web-services aws-lambda

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

我想使用 Python (Boto3) 将 DynamoDB 表以 CSV 格式导出到 S3 存储桶

之前在以下链接中已经问过这个问题: How to write dynamodb scan data's in CSV and upload to s3 bucket using python?

我已经按照评论中的建议修改了代码。代码如下所示:

import csv
import boto3
import json
dynamodb = boto3.resource('dynamodb')
db = dynamodb.Table('employee_details')
def lambda_handler(event, context):
    AWS_BUCKET_NAME = 'session5cloudfront'
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(AWS_BUCKET_NAME)
    path = '/tmp/' + 'employees.csv'
    try:
        response = db.scan()
        myFile = open(path, 'w')  

        for i in response['Items']:
            csv.register_dialect('myDialect', delimiter=' ', quoting=csv.QUOTE_NONE)
            with myFile:
                writer = csv.writer(myFile, dialect='myDialect')
                writer.writerows(i)
            print(i)
    except :
        print("error")

    bucket.put_object(
        ACL='public-read',
        ContentType='application/csv',
        Key=path,
        # Body=json.dumps(i),
    ) …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 amazon-web-services amazon-dynamodb boto3 aws-lambda

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

使用无服务器,如何在 AWS lambda 函数中添加密钥作为环境变量?

我需要使用无服务器和密钥将 AWS lambda 函数部署到文件中的环境变量中。我不想使用 AWS 机密/系统管理器。如何在 serverless.yml 文件中隐藏环境变量?

当我手动上传和部署我的 nodejs AWS lambda 函数时,它能够从环境变量中读取数据并运行。我想使用无服务器而不是手动部署来处理这个问题。

我的无服务器 yml 文件如下:

service: sample-lambda

provider:
  name: aws
  runtime: nodejs10.x

  stage: dev
  region: us-east-2
  apiName: getData
  profile: MYAWS
  timeout: 300
  memorySize: 512

functions:
  getData:
    handler: handler.getData
    name: getData
    description:  API to get data from server
    environment:
      key1: 12345
      key2: abcdef
      server: sample

    events:
     - http:  
         path: getData
         method: post
         cors: true
Run Code Online (Sandbox Code Playgroud)

node.js aws-lambda serverless

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

AWS SNS 在一个 Lambda 中处理多条消息

我有一个过程,它在很短的时间内发布了许多将由 Lambda 处理的 SNS 消息。但是,Lambda 当时正在处理它。它是一种应用类似于 SQS 长池化的方法吗?

我有代码:

exports.saveLog = async (event) => {
  console.log('Event : ', event.Records.length);

  event.Records.forEach(record => {
    const sql = record.Sns.Message;
...
Run Code Online (Sandbox Code Playgroud)

如果它们在短时间内发布,我希望 Lambda 收到一组消息 - 可能吗?

amazon-web-services amazon-sns aws-lambda

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

鉴于 ARN,是否可以从 AWS 下载公共 Lambda 层的内容?

我想从这个GitHub 存储库下载公共 arn 以获得更紧凑的 spacy版本。

"arn:aws:lambda:us-west-2:113088814899:layer:Klayers-python37-spacy:27"
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

amazon-web-services aws-lambda aws-lambda-layers

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

"errorMessage": "[<class 'decimal.Inexact'>, <class 'decimal.Rounded'>]", 在更新 DynamoDb 时

代码如下

import json
from decimal import Decimal
from pprint import pprint
import boto3


def update_movie(title, year, rating=None, plot=None, actors=None, dynamodb=None):
    if not dynamodb:
        dynamodb = boto3.resource('dynamodb')

    table = dynamodb.Table('Movies')

    response = table.update_item(
        Key={
            'year': year,
            'title': title
        },
        UpdateExpression="set info.rating=:r, info.plot=:p, info.actors=:a",
        ExpressionAttributeValues={
            ':r': Decimal(rating),
            ':p': plot,
            ':a': actors
        },
        ReturnValues="UPDATED_NEW"
    )
    return response


def lambda_handler(event, context):
    update_response = update_movie(
        "Rush", 2013, 8.3, "Car show",
        ["Daniel", "Chris", "Olivia"])
    print("Update movie succeeded:")
    pprint(update_response, sort_dicts=False)
Run Code Online (Sandbox Code Playgroud)

在 dynamodb 中更新密钥时,我收到以下错误

  "errorMessage": "[<class 'decimal.Inexact'>, <class …
Run Code Online (Sandbox Code Playgroud)

python amazon-dynamodb aws-lambda

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

AWS Step Function:检查是否为空

Step Function 定义如下:

{
  "StartAt": "Decision_Maker",
  "States": {
    "Decision_Maker":{
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.body.MyData",
          "StringEquals": "null", //that doesn't work :(
          "Next": "Run_Task1"
        }],
        "Default": "Run_Task2"
    },
    "Run_Task1": {
      "Type": "Task",
      "Resource": "url_1",
      "Next": "Run_Task2"
    },
    "Run_Task2": {
      "Type": "Task",
      "Resource": "url_2",
      "End": true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上它是两个任务之间的选择。输入数据是这样的:

{
    "body": {
        "prop1": "value1",
        "myData": {
            "otherProp": "value"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是有时 JSON 中没有 myData。所以输入可能是这样的:

{
    "body": {
        "prop1": "value1",
        "myData": null
    }
}
Run Code Online (Sandbox Code Playgroud)

如何检查 myData 是否为空?

amazon-web-services aws-lambda aws-step-functions

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