我有一个从 Amazon lambda 推送 SNS 通知的用例。我编写了以下代码,其中 IAM 角色具有调用 SNS 的权限。即使使用 Kenesis 触发器,此 Lambda 函数也无法向 SNS 发送任何通知。我通过在 SNS 上订阅我的电子邮件 ID 来确认这一点。
[编辑]:只是一个后续问题。我现在需要查询 DynamoDB 并根据输出,需要调用 SNS 的不同端点。现在,当我查询 DynamoDB 时,执行会在 DynamoDB 查询后停止,甚至无法进行 SNS 检查。
以下是我的 lambda 函数代码。
console.log('Loading function');
var AWS = require('aws-sdk');
exports.handler = function(event, context) {
event.Records.forEach(function(record) {
//var payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
var payload = record.kinesis.data;
console.log('Decoded payload:', payload);
var dynamodb = new AWS.DynamoDB();
var dynamodb_params = {
Key: {
dataSource: {
S: payload
}
},
TableName: 'TableName',
AttributesToGet: …Run Code Online (Sandbox Code Playgroud) 我在 AWS API 网关中有一个 API,使用 lambda 代理集成连接到 python 中的 AWS Lambda 函数。在我的本地计算机上,我正在用 python 测试这个 API。我想向 api 发送字典,并让 api 返回字典中元素的函数。
我用来测试的python代码是:
import requests
import json
url = "https://p68yzl6gu6.execute-api.us-west-1.amazonaws.com/test/helloworld"
headers = {'data': [0,1]}
response = requests.post(url, json=headers)
print(response.text)
Run Code Online (Sandbox Code Playgroud)
由于我无法通过 requests.post 的标头参数发送列表,所以我想我会使用 json。当我尝试这个时,我收到一条 {"message": "Internal server error"}。这是我的 AWS lambda 函数(python):
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': event['data']
}
Run Code Online (Sandbox Code Playgroud)
查看日志,“数据”不是事件的关键。如何访问 AWS Lambda 函数中的列表?当我测试这个时,如何找出事件字典的样子?展望未来,我想发送一个包含字典和列表的大字典。这是正确的方法吗?
使用 CDK 将 ApiGateway 连接到 lambda,我们首先创建一个 RestApi(),然后创建一个 LambdaIntegration 将 Apigateway 连接到 lambda。使用 lambda 别名时如何执行此操作?
如何将 ApiGateway 指向特定的 Lambda 别名解释了如何在没有 CDK 的情况下将 ApiG 连接到 Lambda 别名。如何将其转换为 CDK?
我们的目标是为与 API Gateway 一起使用的 lambda 添加预配置并发和自动缩放。
我的 AWS lambda 项目具有以下结构:
module
app.py
b.py
Run Code Online (Sandbox Code Playgroud)
app.py是我的默认 aws lambda 函数lambda_handler,它工作正常。我决定将所有繁重的计算从它中提取出来以calc实现b.py.
然后,我将它导入到app.py:
from module.b import calc
Run Code Online (Sandbox Code Playgroud)
现在,当我在本地运行它时sam local invoke Function --event events/event.json,它会引发一个错误:
{"errorType":"Runtime.ImportModuleError","errorMessage":"无法导入模块'app':没有名为'module'的模块"}
在我看来,当它准备运行代码时,它将文件移动到其他目录,因此导入中断。为了解决这个问题,我尝试使用相对导入:
from .b import calc
Run Code Online (Sandbox Code Playgroud)
但它也引发了一个错误:
{"errorType":"Runtime.ImportModuleError","errorMessage":"无法导入模块'app':尝试相对导入,没有已知的父包"}
如何在 aws lambda 上设置多文件 python 应用程序?
我在这里查看 AWS SQS 文档:https : //docs.aws.amazon.com/sdk-for-net/v3/developer-guide/ReceiveMessage.html#receive-sqs-message
我的理解是,我们需要AmazonSQSClient.DeleteMessage()在完成处理后删除消息,但是当我们使用 SQS 触发的 Lambda 时,这是否必要?
我正在使用由 触发的 Lambda 函数进行测试SQSEvent,除非我弄错了,否则看起来如果 Lambda 函数运行完成而没有抛出任何错误,则消息不会返回到 SQS 队列。如果这是真的,我宁愿避免对AmazonSQSClient.DeleteMessage().
这是 2019 年的一个类似问题,最佳答案是 SDK 不会自动删除消息,需要在代码中明确删除它们。我想知道从那以后是否有什么变化。
想法?
我正在部署一个 AWS lambda 函数(使用 nodejs 12.x),该函数在调用时执行 AWS 命令(“iot:attachPrincipalPolicy”)。我正在使用凭据从 lambda 执行环境变量运行此命令。
const AWS = require('aws-sdk/global');
const region = process.env['AWS_REGION'];
const accessKeyId = process.env['AWS_ACCESS_KEY_ID'];
const secretAccessKey = process.env['AWS_SECRET_ACCESS_KEY'];
AWS.config.region = region;
AWS.config.credentials = new AWS.Credentials(accessKeyId, secretAccessKey);
// attachPrincipalPolicy command from the AWS SDK here
Run Code Online (Sandbox Code Playgroud)
当我在本地(使用sam local start-api)测试该函数时,它会成功运行,因为在我的 AWS CLI 中,我已经设置了ACCESS_KEY_ID管理员帐户的和 密码。
但是,当我部署该函数并调用它时,即使我对 lambda 的执行角色授予完全管理员访问权限,该命令也会导致 lambda 失败并出现客户端错误(凭据无效)。
在这里,我在内联策略中授予了完全权限,并且还明确添加了预定义的管理员访问策略。
我希望您从环境变量中获得的 AWS_ACCESS_KEY_ID 授予我我在 lambda 函数的执行角色中设置的所有权限,但看起来我授予执行角色的特权并未反映在这些凭证中。
我的假设错了吗?这些凭据来自哪里,我如何才能知道它们允许我做什么?
我知道不推荐扫描 DynamoDB,这是不好的做法。
假设我有一个食品订购网站,我想对所有用户进行每日扫描,以找出上周谁没有订购食品,以便我可以向他们发送电子邮件(仅举个例子)。
这将对数据库提出一些非常高的需求,尤其是对于庞大的用户群。
是否有我缺少的这些计划扫描的替代方法?或者在这种情况下扫描是工作的最佳工具?
我有一个 DynamoDB 表,其列和主键为ipAddress:
我正在从我的 React 网站获取用户的 IP 地址,并通过 Lambda 函数和 API Gateway POST 请求将其插入到 DynamoDB。
如果来自 React 网站的 IP 地址已经存在于 DynamoDB 中,则增加visits列中的值。如果没有,则使用新的 IP 地址和visits = 1. 我尝试使用ConditionExpression但无济于事。
到目前为止,我只使用 Lambda 插入 ipAddress。下面是我在 NodeJS 中的 Lambda 函数:
const AWS = require("aws-sdk");
const documentClient = new AWS.DynamoDB.DocumentClient();
exports.handler = async event => {
const { ipAddress} = JSON.parse(event.body);
const params = {
TableName: "ipAddress",
Item: {
ipAddress: ipAddress,
}
};
try {
const …Run Code Online (Sandbox Code Playgroud) 背景:-我有一个网关帐户(没有权限),其中创建了用户,为了访问 aws 资源,我们使用具有管理员访问权限的角色。
配置文件
[profile gateway]
region = ap-southeast-1
output = json
[profile DA]
region = ap-south-1
output = json
role_arn = arn:aws:iam::xxxxxxxxxxxxx:role/jatin
mfa_serial = arn:aws:iam::xxxxxxxxxx:mfa/atin
source_profile = gateway
Run Code Online (Sandbox Code Playgroud)
凭证文件
[gateway]
aws_access_key_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用无服务器部署 --aws-profile "DA" 来部署我的 lambda,它说 AWS profile "DA" doesn't seem to be configured
但是,如果我aws s3 ls --profile "DA"完美地运行它的作品,那么我想配置文件和凭据的配置没有问题
aws-lambda ×10
node.js ×2
python ×2
amazon-iam ×1
amazon-sns ×1
amazon-sqs ×1
aws-cdk ×1
aws-sam ×1
aws-sdk ×1
caching ×1
database ×1
json ×1
serverless ×1