我尝试构建一个简单的 Rest API。我只知道如何通过映射将查询字符串传递给我的 lambda 函数。现在我想知道是否有方法将“资源”传递给我的 lambda 函数?
例如,我的 lambda 如何获得“水果”和“蔬菜”?
我有一些使用 CDK 创建 API 网关和 Lambda 的 TypeScript 代码。它可以工作并部署到标准 AWS URL。到目前为止,一切都很好。
我现在需要转移 API 网关,以便它在自定义域上运行,以便它可以在 Web 应用程序中设置 cookie。事实证明,这要困难得多,我怀疑我遇到了困难,因为我同时对 TypeScript、AWS 和 CDK 都是新手。网络上有许多文档资源,但大多数都要求我重写我拥有的宝贵的少量工作代码,但我不愿意这样做。
我已经手动创建了一个证书,因为这需要验证,因此在代码中创建它没有意义。除此之外,我希望所有其他资源都由堆栈中的 CDK 代码创建。在我看来,如果我必须手动配置,就违背了 CDK 的目的。
下面的代码部署了我需要的一切gatekeeper.d.aws.example.com- HostedZone、ARecord、LambdaRestApi 和 Function (lambda)。但是它不起作用,因为新分配的 NS 记录与gatekeeper.d.aws.example.com父记录中的记录不匹配d.aws.example.com。
我认为这意味着虽然d.aws.example.com是“已知”的,但gateway子域不能委托给它。
这是我的工作代码:
// Create the lambda resource
const referrerLambda = new lambda.Function(this, 'EisReferrerLambda', {
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'index.handler',
code: lambda.Code.fromAsset(path.join(__dirname, '../../src/lambda')),
environment: env
});
// Set up the domain name on which the API should …Run Code Online (Sandbox Code Playgroud) 我正在尝试临时缓存 AWS lambda 函数执行的一些数据,以省略该 lambda 现在每次执行的 HTTP 请求并优化其速度。
在“查看者请求”中,我有以下逻辑(示例是伪代码)-
exports.handler = async (event) => {
// check /tmp folder for data
const cachedData = await getDataFromCache();
if (cachedData) {
return cachedData;
}
const data = await getDataFromApi();
// save data for 2 mins in /tmp for re-use in next executions
await saveDataInCache(data);
return data;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我尝试将数据保存在/tmp文件夹中几分钟,以便在下次执行中重复使用它并减少 API 请求的数量。
在“查看者请求”lambda 执行期间,当我将数据缓存在/tmp文件夹内时,我立即看到日志中提供了数据 -
async function saveDataInCache(data = {}) {
// save data in tmp folder
try {
await …Run Code Online (Sandbox Code Playgroud) 我正在为我的公司开发一个应用程序,该应用程序利用带有 lambda 函数的 API 网关 REST 端点和 cognito 用户池(带有组)进行授权。
我昨天尝试添加一个新端点,收到了角色策略太大(超过 X 字节)的错误 - 在研究此问题后,我发现较新版本的 AWS amplify CLI(即 4.50.0)通过整合来规避此问题并结合类似的内联策略来减少总大小。
我升级到此版本的 Amplify CLI,发现这个问题已得到解决,但随后我遇到了另一个问题...在尝试通过 推送任何更改时amplify push,我现在收到以下错误:
Parameters: [unauthRoleName, authRoleName] do not exist in the template
这个错误指的是什么“模板”,我该如何解决它?在谷歌搜索后,我看到了一些潜在的解决方案,但没有一个真正对我有用,而对于那些确实有用的人来说,这只是一个临时解决方案。最终,如果我需要继续做一些事情作为临时修复,那么我会接受它并且它会做,但我想知道如何永久解决这个问题,因为我认为肯定缺少一些东西无论是在我这边还是在 AWS 云上...也许是升级 CLI 之前遇到的初始错误的产物?
感谢您的帮助,非常感谢:)
amazon-web-services aws-cloudformation amazon-cognito aws-lambda aws-amplify
我的 lambda 在 Java8 下运行了几年,我刚刚将其更新到 Java 11。它立即崩溃了,给了我这样的错误:
\nCaused by: java.lang.ExceptionInInitializerError\n at com.mycompany.rest.providers.JsonProvider.writeTo(JsonProvider.java:80)\n at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:242)\n at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:227)\n at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)\n at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1116)\n at org.glassfish.jersey.client.ClientRequest.doWriteEntity(ClientRequest.java:461)\n at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:443)\n at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:367)\n at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:265)\n at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:297)\n ... 15 more\nCaused by: java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found.\n at org.apache.logging.log4j.LogManager.callerClass(LogManager.java:571)\n at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:596)\n at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:583)\n at com.mycompany.rest.util.NonClosingOutputStream.<clinit>(NonClosingOutputStream.java:11)\n ... 25 more\nRun Code Online (Sandbox Code Playgroud)\n所讨论的类并不是特别令人兴奋,并且具有在我的类中常见的简单静态初始化:
\npublic class NonClosingOutputStream extends ProxyOutputStream {\n private static final Logger log = LogManager.getLogger(); // Line 11\n\n public NonClosingOutputStream(final OutputStream proxy) …Run Code Online (Sandbox Code Playgroud) 我尝试!If在部分中使用条件resources但失败了。我想控制是否设置provisionedConcurrency我的 lambda。lambda 在function节 下定义。
functions:
getTransactionsHandler:
...
resources:
Conditions:
CommonPCNotZero: !Not [!Equals [0, '${self:custom.commonPC}']]
Resources:
!If
- CommonPCNotZero
- getTransactionsHandler:
Type: AWS::Lambda::Alias
Properties:
FunctionName: !Ref GetTransactionsHandlerLambdaFunction
FunctionVersion: !Join ['', [!Ref GetTransactionsHandlerLambdaFunction, ':$LATEST']]
ProvisionedConcurrencyConfig:
ProvisionedConcurrentExecutions: '${self:custom.commonPC}'
- !Ref AWS::NoValue
Run Code Online (Sandbox Code Playgroud)
运行时出现以下错误sls deploy:
Error: The CloudFormation template is invalid: Template format error: [/Resources/Fn::If] resource definition is malformed
Run Code Online (Sandbox Code Playgroud)
使用条件的正确方法是什么!if?
amazon-web-services aws-cloudformation aws-lambda serverless-framework
环境。
jupyterlab,Python 3.8。
ubuntu 20.04LTS。
(客户端:macos bigsur / google chrome)。
使用boto3。
情况。
我构建了 docker 镜像并将其成功推送到 ECR。
该图像具有 awslambdaric 并包含 aws-lambda-rie。
我可以使用 AWS Lambda 控制台部署该映像。
我想。
使用 boto3(=python 代码)将其部署到 lambda。
问题。
按照 boto3 手册,部署 lambda 如下:
import boto3
lambdac = boto3.client('lambda')
dic = {
'FunctionName':'lambda-name',
# 'Runtime':'python3.8',
'Role':'my-role-arn',
'Code':{'ImageUri':uri},
}
lambdac.create_function(**dic)
Run Code Online (Sandbox Code Playgroud)
这会出错。
它需要Runtime,所以我添加了runtime(我认为docker容器版本不需要runtime)。
并运行,并返回另一个错误。
InvalidParameterValueException: An error occurred (InvalidParameterValueException) when calling the CreateFunction operation: Runtime and Handler are mandatory parameters for functions created with deployment packages.
Run Code Online (Sandbox Code Playgroud)
这个错误让我想到“不支持 …
首先,我只想说我对 AWS 总体来说还是个新手(1-2 周)。所以我可能从一开始就认为不正确。
我正在开发一个应用程序,我想在 JSX 中单击按钮并触发 Lambda 函数,该函数从 dynamodb 表获取数据并将其显示在 UI 中。
我正在使用 aws cdk 将基础设施编写为代码。我该怎么面对这个?您有我可以遵循的指南吗?
我想从订阅过滤器获取日志,然后将日志放入 s3 存储桶中并将它们发送到 ES。
类似于这里的图表:
https://aws.amazon.com/solutions/implementations/centralized-logging/
当我使用这个功能时:
/*
For processing data sent to Firehose by Cloudwatch Logs subscription filters.
Cloudwatch Logs sends to Firehose records that look like this:
{
"messageType": "DATA_MESSAGE",
"owner": "123456789012",
"logGroup": "log_group_name",
"logStream": "log_stream_name",
"subscriptionFilters": [
"subscription_filter_name"
],
"logEvents": [
{
"id": "01234567890123456789012345678901234567890123456789012345",
"timestamp": 1510109208016,
"message": "log message 1"
},
{
"id": "01234567890123456789012345678901234567890123456789012345",
"timestamp": 1510109208017,
"message": "log message 2"
}
...
]
}
The data is additionally compressed with GZIP.
The code below will:
1) Gunzip …Run Code Online (Sandbox Code Playgroud) amazon-web-services elasticsearch kibana aws-lambda amazon-kinesis-firehose
我之前使用过 Lambda 函数,如果我没记错的话,我应该在/tmp.
然而,我的 Go lambda 函数似乎没有与 fs 正确交互:
exec.Command("ls -la /").Output()返回空
exec.Command("rm -rf /tmp/xxx").Run()回报fork/exec : no such file or directory
exec.Command("mkdir -p /tmp/xxx").Run()回报fork/exec : no such file or directory
真的很奇怪。它使用 go1.x 环境(因此,我猜 amazonlinux:2)
更新
我可以使用 Go os 函数访问 fs:
os.RemoveAll("/tmp/xxx")
if _, err := os.Stat("/tmp/xxx"); os.IsNotExist(err) {
if err := os.Mkdir("/tmp/xxx", os.ModePerm); err != nil {
return err
}
}
Run Code Online (Sandbox Code Playgroud)
但我确实需要 exec 之后运行(二进制命令),并在该 tmp 文件夹中写入一个文件。这种情况下的错误是相同的(没有这样的文件或目录)。即使我刚刚使用上述命令创建了该文件夹。
aws-lambda ×10
aws-cdk ×2
aws-amplify ×1
boto3 ×1
caching ×1
docker ×1
go ×1
java ×1
javascript ×1
kibana ×1
log4j2 ×1
node.js ×1
python ×1
serverless ×1