AWS s3 -> lambda -> sns = 如何将 url link 和新图像发送到 android 应用程序?
AWS s3 - > lambda -> sns = How to send url link with new image to android app?
新的 S3 项目触发 lambda 函数。我想以某种方式提取它的 URL 并将其作为 link 或可以从 Android phone 上的通知打开的内容传递给 sns。我现在可以向 phone 发送通知,但需要从 S3 传递新元素。有没有人有任何想法,是否有可能实现这样的目标?
这是我的 lambda 函数的代码。它一团糟,因为我一直在尝试不同的组合来尝试这个:
import logging
import boto3
sns = boto3.client('sns')
s3 = boto3.client('s3')
# Change topic, qos and payload
def lambda_handler(event, context):
# retrieve bucket name and file_key from the S3 event
bucket_name = event['Records'][0]['s3']['bucket']['name']
file_key = event['Records'][0]['s3']['object']['key']
#logger.info('Reading {} from {}'.format(file_key, bucket_name))
presigned_url = s3.genereate_presigned_url(
'get_object',
Params = {'Bucket': bucket_name, 'Key': file_key}
)
sns.publish(
TargetArn='arn:aws:sns:eu...',
Message=presigned_url
)
错误:
Response:
{
"errorMessage": "'S3' object has no attribute
'genereate_presigned_url'",
"errorType": "AttributeError",
"stackTrace": [
[
"/var/task/lambda_function.py",
14,
"lambda_handler",
"presigned_url = s3.genereate_presigned_url("
],
[
"/var/runtime/botocore/client.py",
555,
"__getattr__",
"self.__class__.__name__, item)"
]
]
}
感谢 dpwrussell,我能够从测试函数中提取 url 并了解有关 lambda 和 AWS 的更多信息。以下是代码和 lambda 触发器测试的更新版本。
from __future__ import print_function
import logging
import boto3
logger = logging.getLogger()
logger.setLevel(logging.INFO)
sns = boto3.client('sns')
s3 = boto3.client('s3')
# Change topic, qos and payload
def lambda_handler(event, context):
# retrieve bucket name and file_key from the S3 event
bucket_name = event['Records'][0]['s3']['bucket']['name']
print(bucket_name)
file_key = event['Records'][0]['s3']['object']['key']
#logger.info('Reading {} from {}'.format(file_key, bucket_name))
print('this will also show up in cloud watch')
logger.info('got event{}'.format(bucket_name))
logger.info('got event{}'.format(file_key))
generate_presigned_url = s3.genereate_presigned_url(
'get_object',
Params = {'Bucket': bucket_name, 'Key': file_key}
)
sns.publish(
TargetArn='arn.........',
Message=generate_presigned_url
)
测试活动:
{
"Records": [
{
"s3": {
"bucket": {
"name": "mybucket"
}
},
"object": {
"key": "Example.json.gz"
}
}
]
}
那不是 generate_presigned_url
的界面。
是:
presigned_url = s3.generate_presigned_url(
'get_object',
Params = {'Bucket': bucket_name, 'Key': file_key}
)
您的输入也有问题。您的输入需要具有这样的结构。否则,您的 lambda 函数将失败,并显示您在尝试从事件中读取这些参数时得到的 KeyError
。
{
"Records": [
"s3": {
"bucket": {
"name: "mybucketname"
},
"object": {
"key": "mybucketkey"
}
}
]
}
谢谢@Marszal 和@dpwrussell。
我是 python 的新手,这个 post 帮助我获得了所需的输出。我正在使用 Python 3.8 运行时,并且在 generate_presigned_url 中出现错误。错误看起来像:
[错误] AttributeError: 'S3' 对象没有属性 'genereate_presigned_url'
此外,我还必须获取文件大小。所以我尝试了这种简单的方法来获得最终的 URL 并且它正在工作。
import boto3
import logging
import json
sns = boto3.client('sns')
s3 = boto3.client('s3')
def lambda_handler(event, context):
# retrieve bucket name, file_key and size from the S3 event
bucket_name = event['Records'][0]['s3']['bucket']['name']
print("Bucket Name: "+bucket_name)
file_key = event['Records'][0]['s3']['object']['key']
print("File Key: "+file_key)
file_size = event['Records'][0]['s3']['object']['size']
print("File Size: "+str(file_size)+"kb")
s3url = "s3://"+bucket_name+"/"+file_key
print("S3 URL: "+s3url)
新的 S3 项目触发 lambda 函数。我想以某种方式提取它的 URL 并将其作为 link 或可以从 Android phone 上的通知打开的内容传递给 sns。我现在可以向 phone 发送通知,但需要从 S3 传递新元素。有没有人有任何想法,是否有可能实现这样的目标?
这是我的 lambda 函数的代码。它一团糟,因为我一直在尝试不同的组合来尝试这个:
import logging
import boto3
sns = boto3.client('sns')
s3 = boto3.client('s3')
# Change topic, qos and payload
def lambda_handler(event, context):
# retrieve bucket name and file_key from the S3 event
bucket_name = event['Records'][0]['s3']['bucket']['name']
file_key = event['Records'][0]['s3']['object']['key']
#logger.info('Reading {} from {}'.format(file_key, bucket_name))
presigned_url = s3.genereate_presigned_url(
'get_object',
Params = {'Bucket': bucket_name, 'Key': file_key}
)
sns.publish(
TargetArn='arn:aws:sns:eu...',
Message=presigned_url
)
错误:
Response:
{
"errorMessage": "'S3' object has no attribute
'genereate_presigned_url'",
"errorType": "AttributeError",
"stackTrace": [
[
"/var/task/lambda_function.py",
14,
"lambda_handler",
"presigned_url = s3.genereate_presigned_url("
],
[
"/var/runtime/botocore/client.py",
555,
"__getattr__",
"self.__class__.__name__, item)"
]
]
}
感谢 dpwrussell,我能够从测试函数中提取 url 并了解有关 lambda 和 AWS 的更多信息。以下是代码和 lambda 触发器测试的更新版本。
from __future__ import print_function
import logging
import boto3
logger = logging.getLogger()
logger.setLevel(logging.INFO)
sns = boto3.client('sns')
s3 = boto3.client('s3')
# Change topic, qos and payload
def lambda_handler(event, context):
# retrieve bucket name and file_key from the S3 event
bucket_name = event['Records'][0]['s3']['bucket']['name']
print(bucket_name)
file_key = event['Records'][0]['s3']['object']['key']
#logger.info('Reading {} from {}'.format(file_key, bucket_name))
print('this will also show up in cloud watch')
logger.info('got event{}'.format(bucket_name))
logger.info('got event{}'.format(file_key))
generate_presigned_url = s3.genereate_presigned_url(
'get_object',
Params = {'Bucket': bucket_name, 'Key': file_key}
)
sns.publish(
TargetArn='arn.........',
Message=generate_presigned_url
)
测试活动:
{
"Records": [
{
"s3": {
"bucket": {
"name": "mybucket"
}
},
"object": {
"key": "Example.json.gz"
}
}
]
}
那不是 generate_presigned_url
的界面。
是:
presigned_url = s3.generate_presigned_url(
'get_object',
Params = {'Bucket': bucket_name, 'Key': file_key}
)
您的输入也有问题。您的输入需要具有这样的结构。否则,您的 lambda 函数将失败,并显示您在尝试从事件中读取这些参数时得到的 KeyError
。
{
"Records": [
"s3": {
"bucket": {
"name: "mybucketname"
},
"object": {
"key": "mybucketkey"
}
}
]
}
谢谢@Marszal 和@dpwrussell。 我是 python 的新手,这个 post 帮助我获得了所需的输出。我正在使用 Python 3.8 运行时,并且在 generate_presigned_url 中出现错误。错误看起来像:
[错误] AttributeError: 'S3' 对象没有属性 'genereate_presigned_url'
此外,我还必须获取文件大小。所以我尝试了这种简单的方法来获得最终的 URL 并且它正在工作。
import boto3
import logging
import json
sns = boto3.client('sns')
s3 = boto3.client('s3')
def lambda_handler(event, context):
# retrieve bucket name, file_key and size from the S3 event
bucket_name = event['Records'][0]['s3']['bucket']['name']
print("Bucket Name: "+bucket_name)
file_key = event['Records'][0]['s3']['object']['key']
print("File Key: "+file_key)
file_size = event['Records'][0]['s3']['object']['size']
print("File Size: "+str(file_size)+"kb")
s3url = "s3://"+bucket_name+"/"+file_key
print("S3 URL: "+s3url)