我正在尝试使用 cloudformation 作为带有 Fargate 的 ECS 服务加载一些休息服务。我不想要这些服务的公共域名。我将通过我的 AWS Lambda 函数在内部访问它们。我意识到AWS Fargate需要负载均衡,负载均衡器需要证书,证书需要域名。可能我遗漏了一些东西,但我尝试在没有负载均衡器的情况下加载 AWS Fargate,但无法从 Lambda 访问它。
问题是; 如何在没有负载均衡器的情况下使用 Fargate 在 ECS 上运行我的服务?
我正在尝试使用本教程将 docker 容器上传到 AWS ECR for Lambda。我的问题是我的 python 脚本使用 psycopg2,并且我不知道如何在 Docker 映像中安装 psycopg2。我知道我需要postgres-devel库libq和 gcc 来编译,但它仍然不起作用。
我的要求.txt:
pandas==1.3.0
requests==2.25.1
psycopg2==2.9.1
pgcopy==1.5.0
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM public.ecr.aws/lambda/python:3.8
WORKDIR /app
COPY my_script.py .
COPY some_file.csv .
COPY requirements.txt .
RUN yum install -y postgresql-devel gcc*
RUN pip install -r requirements.txt
CMD ["/app/my_script.handler"]
Run Code Online (Sandbox Code Playgroud)
构建、运行图像并在本地测试 lambda 函数后,我收到以下错误消息:
psycopg2.OperationalError: SCRAM authentication requires libpq version 10 or above
所以我认为容器的 postgres(-devel) 版本错误。但我不确定如何安装正确的版本?关于将 psycopg2 脚本部署到 docker 以使用 lambda 有什么技巧吗?
使用 AWS .NET Core 3.1 模拟 Lambda 测试工具,我无法从 appsettings.json 甚至 app.config 文件中读取 lambda 函数。
这是两个独立的方法,当我尝试获取返回值时,每个方法都返回 null。
在单独的 .NET Core 3.1 控制台应用程序中,这些相同的方法可以完美地工作。
那么,运行时的“模拟 Lambda 测试工具”是否有某种原因不允许我的代码从设置为始终复制的 JSON 或 App.config 文件中读取?这是否意味着打包并上传到 AWS Lambda 控制台后将无法在 AWS 上运行?
我的情况不允许我将 Lambda 环境变量用于本地数据库连接字符串。我无法将连接字符串存储在代码中,因为它必须来自 .json 或 .config 文件。
对此有什么想法或智慧吗?
代码:
方法一
// requires: System.Configuration.ConfigurationManager
var connString = System.Configuration.ConfigurationManager.AppSettings["connectionString"];
/*
Reads App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="connectionString" value="Server=127.0.0.1;Port=0000;Database=some-db;User Id=some-user;Password=some-password;" />
</appSettings>
</configuration>
*/
Run Code Online (Sandbox Code Playgroud)
方法2
// requires: Microsoft.Extensions.Configuration; Microsoft.Extensions.Configuration.Json;
public class DbConfig
{
public string …Run Code Online (Sandbox Code Playgroud) 我正在使用无服务器,并且试图弄清楚如何重写此 serverless.yml 文件,这样我就不会重复每个函数的环境变量。有没有办法全局设置环境变量?
service: test-api
frameworkVersion: ">=1.2.0 <2.0.0"
provider:
name: aws
runtime: nodejs12.x
timeout: 30
stage: dev
memorysize: 2048
region: us-east-2
logRetentionInDays: 21
functions:
doCreate:
handler: functions/do-create.handler
environment:
DB_PORT: ${ssm:/${self:custom.stage}/db_port}
DB_URL: ${ssm:/${self:custom.stage}/db_url}
API_KEY: ${ssm:/${self:custom.stage}/api_key}
ENV: "${self:custom.stage}"
SEARCH_ARN: ${ssm:/${self:custom.stage}/search_arn}
doUpdate:
handler: functions/do-update.handler
environment:
DB_PORT: ${ssm:/${self:custom.stage}/db_port}
DB_URL: ${ssm:/${self:custom.stage}/db_url}
API_KEY: ${ssm:/${self:custom.stage}/api_key}
ENV: "${self:custom.stage}"
SEARCH_ARN: ${ssm:/${self:custom.stage}/search_arn}
Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-lambda serverless-framework serverless
我使用 NodeJS 作为我的 lambda 函数。目前我正在使用 NPM 包来连接 Redis 并将数据读/写到 Elasticache 中。但它给出了内部服务器错误。在 aws-sdk NPM 包中也有一些与elasticache相关的方法,但我找不到任何方法来设置elasticache和从elasticache获取值。我应该为此做什么?
我需要将从 S3 获取的文件保存到 Lambda 的文件系统中,我想知道是否可以简单地使用fs.writeFileSync?
或者我是否仍然必须使用context此处描述的功能:
How to Write and Read files to Lambda-AWS with Node.js
(试图找到更新的例子,但找不到)。
推荐的方法是什么?
请指教。
我只需通过一次调用将一条消息传递到标准(不是 FIFO,但与问题无关)SQS 队列。
但是,下面的代码通过 1 个调用发送 2 条消息。
const AWS = require('aws-sdk')
AWS.config.update({region: process.env.AWS_REGION})
const sqs = new AWS.SQS({apiVersion: '2012-11-05'});
async function sendToSQSEvent(body,attributes=null){
var m_body
if (attributes != null)
{
m_body = {
body : body,
attributes : attributes
};
}
else{
m_body = body;
}
m_body = JSON.stringify(m_body);
var params = {
// DelaySeconds: 0, <-- i try but only delay reception
MessageAttributes: {
"Title": {
DataType: "String",
StringValue: "TIME_OUT"
},
"Author": {
DataType: "String",
StringValue: …Run Code Online (Sandbox Code Playgroud) javascript amazon-sqs amazon-web-services es6-promise aws-lambda
您好,我目前在 s3 存储桶中设置了事件通知。该通知被发送到SNS 主题,然后发送到SQS 队列,最后发送到lambda。
我的最终目标是让 lambda 读取事件通知 json 并解析出存储桶和密钥。
问题是,当我使用 python 打印出“ event ”对象时,我在 json 中看到了存储桶名称,但没有看到键。我应该如何/在哪里进行调试以弄清楚发生了什么?我记得在以前的实现中看到过 json 中的密钥
json 看起来像:
{
'Records': [{
'messageId': '15d42178-c59c-4f3a-8efa-cce8a20acd5b',
'receiptHandle': 'AQEBnPN7q4+jLFQfExOytZYH69w4kvI4ohjJGFqUqOAvCjRHMfbFFvgEeLVjonZ5q4GAYyzLzDSRQmZv3+YTvE3VYqKmU+Nt0rgX824LoMMkKKMuSWBT6c1a0X5dXRJRzFaOKjpniONRg5Gdm1V9I/7mW0x+Zfi0PXr5cQZXVA1NNUdJ4tIkwtpuC+Rh/dbGFQmAo6fQDuCnpzRW1NKGGda440t3ivtUQMvrniwY8ILKVoX9pnS1rAVgVPGBUo8mXyH9ec9p/Er9O9N5Kxc3xQE44MhHUygD1iJbRROBHG9m0Mj6qbKx4uI7S4KQVWRK8hHkxYFUtP4NzhzcGP1LfY91+zG4mNweGzQkfDbvn0LG9+6guxv9dW+uGz1c3f9My7272s+ABfksvfbNRgPSgwJecg==',
'body': '{\n "Type" : "Notification",\n "MessageId" : "78cadcbb-f349-5bae-b39b-85504866b186",\n "TopicArn" : "<topic arn>",\n "Subject" : "Amazon S3 Notification",\n "Message" : "{\\"Service\\":\\"Amazon S3\\",\\"Event\\":\\"s3:TestEvent\\",\\"Time\\":\\"2021-10-21T19:01:03.083Z\\",\\"Bucket\\":\\"<s3 bucket>\\",\\"RequestId\\":\\"TCJP8AZ6S75XXXPN\\",\\"HostId\\":\\"VYNq+Jh5Hkg+Vykp2RcIy9lSca7uJyhzLPfE8tcgnt3Je9kH0I+H3zvzvJkd6IvfZKZm2jYqu4Q=\\"}",\n "Timestamp" : "2021-10-21T19:01:03.285Z",\n "SignatureVersion" : "1",\n "Signature" : "EE9xsZx8hezxh8Yhyj8DLc+VSGYowl641kHgqr8tWq2msNwOBv4KEZoTtHJ/hdnfNYLEBsR7imsfv5ZrX7nKRKL2kR8xax57tcih7GRbifIuFyrs9wAhtcuclf2NJQG4eY9OrOHHxPN3fSvNI9xduPeBrxB2TAfbTcWq4AeN0C4KriV18J2dU28ecMJGtmqK0JM+2KLEuwQe/dyYiEnEnWu5EfGweDhYCRvmB1aUPRcW4s3yOHIckklmHhBLkbmufl1me/hdO7GEGa1ju8wJDF33hmmCCSE6M7ITl9niWICBtvWlFz1Md5OiswyriRyN4LZjmvEjzRZtNwy/qMkDYA==",\n "SigningCertURL" : "<cert url>",\n "UnsubscribeURL" : "<unsubscribe url>"\n}',
'attributes': {
'ApproximateReceiveCount': '34',
'SentTimestamp': <timestamp>,
'SenderId': …Run Code Online (Sandbox Code Playgroud) amazon-s3 amazon-sqs amazon-web-services amazon-sns aws-lambda
我们已将 Chalice 应用程序部署到 AWS,并且在调用需要 API 密钥的端点时收到以下响应:
{
"message": "Forbidden"
}
Run Code Online (Sandbox Code Playgroud)
可以毫无问题地调用不需要 API 密钥的端点。
奇怪的是,我们过去能够毫无问题地调用需要 API 密钥的端点,因此我们还考虑是 Chalice 或 AWS 更新导致了该问题。
我们使用 Postman 将 API 密钥作为请求中的标头传递:
x-api-key:我们的 API 密钥的值。
我们也没有在 CloudWatch 中收到任何日志,大概是因为该问题实际上并未调用端点。AWS 在请求到达我们的端点之前就阻止了该请求。
我们的 API 密钥配置如下:
API 密钥:
相关使用计划:
API 密钥和使用计划看起来配置正确,因此我们假设问题不在于 API 密钥本身。
来自“排查 API Gateway 403 禁止错误”文档:
如果 API 密钥无效(或者我们假设不正确),我们将收到以下消息:
“指定的 API 密钥标识符无效”
然而,我们却收到了通用的“Forbidden”错误:
“禁止”
文档仅列出了导致此错误的三种可能原因:
当在 API 中激活 AWS WAF 时,请求将被 Web 应用程序防火墙 (WAF) 过滤阻止。
使用公共 …
api-key amazon-web-services http-status-code-403 aws-lambda chalice
我有一个名为 的模块custom_module.py,其中包含我想在几个不同的 Lambda 中使用的函数和方法。代码如下所示:
def test():
return 'Custom module'
Run Code Online (Sandbox Code Playgroud)
我尝试通过压缩该文件并使用表单创建一个层来将其转换为 Lambda 层。一切似乎都运行良好,我将模块导入到 Lambda 中使用,如下所示:
import json
from custom_module import test
print('Loading function')
def lambda_handler(event, context):
return test()
Run Code Online (Sandbox Code Playgroud)
不幸的是,运行它会返回一个"Unable to import module 'lambda_function': No module named 'custom_module'"错误。我到底做错了什么?我还指定了正确的运行时和架构。
编辑
根据评论,我尝试了这个文件结构:
layer
|
+--- python
|
+--- custom_module
|
+--- __init__.py (contains the test() method)
Run Code Online (Sandbox Code Playgroud)
layer我将文件夹压缩layer.zip并上传。不幸的是仍然遇到同样的问题。
aws-lambda ×10
amazon-sqs ×2
python ×2
amazon-ecs ×1
amazon-elb ×1
amazon-s3 ×1
amazon-sns ×1
api-key ×1
app-config ×1
aws-fargate ×1
aws-sdk ×1
c# ×1
chalice ×1
docker ×1
es6-promise ×1
fs ×1
javascript ×1
json ×1
node.js ×1
psycopg2 ×1
redis ×1
serverless ×1