我对 AWS CDK 还很陌生,对 AWS 没有太多经验。在我正在编写的 CDK 堆栈中,我必须授予使用其他 CDK 模板构建并且已经在 aws 中的资源的权限。
假设我的堆栈 A 包含一个 lambda,该 lambda 将从另一个服务 X 调用。服务 X 需要具有 lambda 的调用权限。我可以从堆栈 A 代码中授予服务 X 权限,还是需要修改服务 X 堆栈?
如何从 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) 就像标题所暗示的那样,我有一个想探索但不知道如何去做的场景。
我有一个 lambda 函数processCSVFile。我还有一个 SQS 队列,在每天的固定时间,它会填充来自 S3 的 csv 文件链接,比如说大约 2000 条消息。现在,一旦 SQS 队列有消息,我想一次处理 25 条消息。
我正在寻找的场景是同时处理 25 条消息,我希望这 25 条消息分别由 25 个 lambda 调用处理。我以为我可以SendMessageBatch在 SQS 中使用函数,但这只会将消息传递到队列,它似乎不适用于我的用例。
我的问题是,我是否能够执行上述操作,如果可能,哪些文档或用例可以解释我正在寻找的内容。另外,如果这个用例是不可能的,你有什么推荐的替代方法来完成我想要同时完成的处理。
我在我的 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) 之前在以下链接中已经问过这个问题: 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
我需要使用无服务器和密钥将 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) 我有一个过程,它在很短的时间内发布了许多将由 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 收到一组消息 - 可能吗?
我想从这个GitHub 存储库下载公共 arn 以获得更紧凑的 spacy版本。
"arn:aws:lambda:us-west-2:113088814899:layer:Klayers-python37-spacy:27"
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
代码如下
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) 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 是否为空?
aws-lambda ×10
python ×3
amazon-s3 ×2
amazon-sns ×2
amazon-sqs ×1
aws-cdk ×1
boto3 ×1
node.js ×1
serverless ×1