我将问题简化为以下示例。我们有两种 XML 请求类型:<data1>some-data</data1>
和 ,<data2>other-data</data2>
它们都到达同一个端点,例如POST https://example.com/my-endpoint
。我们希望data1
分别使用 AWS Lambda Node.js 和data2
AWS EC2 Apache + PHP 进行服务。这该如何实现?
这是对此处提出的问题的补充:GCP 到 AWS Hosted Zone 迁移
我已经从 GCP 导出 DNS 记录并将其导入 AWS。我还保留了 GCP 中的条目,以确保到达 GCP Clod DNS 的任何请求仍将得到解析。我已更新 DNS 注册商以将 NS 记录指向 AWS。但是,在此更改之后,我们的一些用户无法访问我们的服务器。我们的许多用户都可以访问服务器,但有些用户无法访问。可能是什么原因?
a) 在 AWS 中导入记录之后,在我更改注册商中的条目之前,是否应该留出一些时间?
b) 有没有一种安全的方法来检查 DNS 传播是否完成?我使用https://www.whatsmydns.net/进行了检查,我发现全世界的所有名称服务器都能够解析我的域名。但由于我们的一些用户抱怨,我不得不撤销在我的注册商中所做的更改。
如有任何提示我将不胜感激。
一些 AWS 证书具有此颁发者:
issuer=C=US, O=Amazon, CN=Amazon RSA 2048 M02
其他人有这个:
issuer=C=US, O=Amazon, CN=Amazon RSA 2048 M03
它们之间有什么区别?
我们有一个 Web 服务,其前端被拆分为多个应用程序,由云端端点提供。这些应用程序目前都有自己的子域,例如 service-a.mydomain.com、service-b.mydomain.com 等。
然而,如今子域名几乎对谷歌如何建立域名权威没有影响,域名权威已经成为 SEO 的圣杯。因此,为了搜索引擎优化的目的,我们希望将所有内容移至顶级域名中的路径。因此,之后应该是 mydomain.com/service-a、mydomain.com/service-b 等。
显然,这似乎需要一个代理,如 API 网关或类似的东西,来路由所有内容。问题是……如果所有内容都通过同一个代理,那么 cloudfront(或任何其他 CDN)的主要优势就几乎消失了。当然,你可以在代理后面运行它,但你只有一个缓存。再见边缘位置。那时,将缓存放在代理本身中确实更有意义。
所以我的问题是,如果我不能为每个端点提供自己的子域,是否还有某种方法可以利用 Cloudfront 边缘位置?或者这种域设计方式是否只需要放弃 CDN 的优势?
我有一个 ECS 集群(在 Fargate 上1.4.0
),其中包含许多任务和服务,它们都登录到 Cloudwatch,一切正常。我有几个 ECS 计划任务(通过 EventBridge),我知道它们会按预期在计划时间运行。我知道这一点是因为 a) 我可以在 EventBridge 规则监控选项卡中看到它,并且 b) 计划任务之一的工作是发送电子邮件,我收到了该电子邮件。那么它正在运行,但不会像其他任务一样登录到 CloudWatch 吗?
在我开始故障排除步骤之前,让我给你提供更多见解:
在每个任务定义中,我都有这个日志块:
logConfiguration = {
logDriver = "awslogs"
options = {
awslogs-group = aws_cloudwatch_log_group.ecs_log_group.name
awslogs-region = "us-east-1"
awslogs-stream-prefix = "prod-cron-engage"
}
}
我知道那里的一切都是正确的,因为我的其他未安排的任务(通过服务全天候运行)都已成功记录在那里。
每个任务都有以下两个参数:
execution_role_arn = aws_iam_role.ecs_task_execution_role.arn
task_role_arn = aws_iam_role.ecs_task_execution_role.arn
这些都是:
resource "aws_iam_role" "ecs_task_execution_role" {
name = "ecsTaskExecutionRole"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "ecs-tasks.amazonaws.com"
}
}
]
})
tags = {
"Name" = "${var.name_prefix}-iam-ecs-role"
}
}
resource "aws_iam_role_policy_attachment" "ecs_task_execution_role_policy" {
role = aws_iam_role.ecs_task_execution_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}
其中AmazonECSTaskExecutionRolePolicy
,有针对 ECS 的基本策略,包括访问 CloudWatch。
另外,这是我的事件桥规则:
resource "aws_cloudwatch_event_rule" "prod_cron_engage_rule" {
name = "prod-engage-rule"
description = "Run Prod Engage task every 30 minutes."
schedule_expression = "rate(30 minutes)"
}
resource "aws_cloudwatch_event_target" "prod_cron_engage_target" {
target_id = "run-prod-engage-task-every-half-an-hour"
rule = aws_cloudwatch_event_rule.prod_cron_engage_rule.name
arn = aws_ecs_cluster.ecs_cluster.arn
role_arn = aws_iam_role.eventbridge_role.arn
ecs_target {
task_definition_arn = aws_ecs_task_definition.prod_cron_engage_task.arn
task_count = 1
launch_type = "FARGATE"
network_configuration {
subnets = module.vpc.private_subnets
security_groups = [aws_security_group.ecs_sg.id]
assign_public_ip = false
}
tags = {
"Name" = "${var.name_prefix}-ecs-prod-cron-engage"
}
}
}
以下是 EventBridge 角色和策略:
resource "aws_iam_role" "eventbridge_role" {
name = "eventbridge-ecs-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Principal = {
Service = "events.amazonaws.com"
}
Effect = "Allow"
Sid = ""
}
]
})
}
resource "aws_iam_role_policy" "eventbridge_policy" {
name = "eventbridge-ecs-policy"
role = aws_iam_role.eventbridge_role.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "ecs:RunTask"
Effect = "Allow"
Resource = [
aws_ecs_task_definition.prod_cron_engage_task.arn
]
},
{
Action = "iam:PassRole"
Effect = "Allow"
Resource = aws_iam_role.eventbridge_role.arn
}
]
})
}
我到目前为止做了什么?
起初,我以为也许存在某种限制规则,拒绝这些计划任务访问 CloudWatch(不太可能,但我想既然它们现在已通过 EventBridge 进行安排,也许这是可能的),所以我授予 ECS 和 EventBridge 完全的 CloudWatch 访问权限。什么都没有改变。
我尝试创建一个具有这些广泛权限的新日志组,并查看任务是否可以创建该新日志组。新日志组不存在,因此无法通过任务定义创建日志组。
此错误出现在日志文件中(略微格式化以便于阅读):
StatusCode: 400 : Bad Request : {
schema :[ urn:ietf:params:scim:api:messages:2.0:Error ]
schemas :[ urn:ietf:params:scim:api:messages:2.0:Error ]
detail : 1 validation error detected:
Value at 'phoneNumbers.1.value' failed to satisfy constraint:
Member must satisfy regular expression pattern:
[\\p{L}\\p{M}\\p{S}\\p{N}\\p{P}\\t\\n\\r ]+
}
这可能是由于电话号码的格式如下:
+1 (212) 555-1212
而不是以下格式之一:
12125551212
+1.212.555.1212
如何解释这个正则表达式来证实这一点?
我有一个扩展组 (ASG),用于使实例为执行任务做好准备。需要时,实例会与 ASG 分离,并且 ASG 会在需要时启动另一个实例。
实例类型为 c6g.4xlarge。操作系统为 ubuntu 22.04
下面是显示启动时间的日志。
systemd[1]: Startup finished in 4.850s (kernel) + 42min 16.004s (userspace) = 42min 20.854s.
我可以看到多个这样的失败的 SSM 日志
ERROR [Registrar] failed to register identity: error calling RegisterManagedInstance API: RequestError: send request failed
caused by: Post "https://ssm.us-xxxx-x.amazonaws.com/": dial tcp xx.xx.xx.xx:xx: i/o timeout
INFO [Registrar] sleeping for 18.7 minutes before retrying registration
这种情况只发生在百分之几的情况下,我无法找出其中的规律。
我有一个应用程序,我正在使用 AWS 来运行它。我有两个实例。一个已停止,一个正在运行。每个实例都附加了一个卷。我想终止已停止的实例,但我想确保它不会影响应用程序。我的假设是,已停止的实例不会影响应用程序,因为它已停止。
我目前还没有做任何事情,因为我不想弄乱这个应用程序。
我有 3 个实例(node-0
,, )运行 2node-1
个node-2
服务 - 一个是 a websocket
,另一个是 an API
(两个服务在每个实例中运行)。
目标群体设置:
目标群体 | 实例 | 健康检查路径 |
---|---|---|
api-节点-0 | 节点-0 | /某些路径/api/v1/ping |
api-节点-1 | 节点 1 | /某些路径/api/v1/ping |
api-节点-2 | 节点2 | /某些路径/api/v1/ping |
websocket-节点-0 | 节点-0 | /某些路径/websocket/v1/ping |
websocket-节点-1 | 节点 1 | /某些路径/websocket/v1/ping |
websocket-节点-2 | 节点2 | /某些路径/websocket/v1/ping |
听众和规则:
HTTPS:443 监听器
规则:
api
- 条件:路径
/some-path/api/*
- 行动:转发给目标群体:
- api-节点-0 (33.33%)
- api-节点-1 (33.33%)
- API 节点-2 (33.33%)
- 粘性:关闭
网络套接字
- 条件:路径
/some-path/websocket/*
- 行动:转发给目标群体:
- websocket-节点-0 (33.33%)
- websocket-节点-1 (33.33%)
- websocket-节点-2 (33.33%)
- 粘性:关闭
默认
- 条件:无其他规则适用
- 行动:转发给目标群体:
- api-节点-0 (100%)
健康检查属性:
- 间隔:30秒
- 超时:5 秒
- 健康阈值:2
- 不健康阈值:2
- 健康阈值:连续2次健康检查成功
- 不健康阈值:连续 2 次健康检查失败
- 成功代码:200
负载均衡器属性:
- HTTP 客户端保持连接时长:3600 秒
- 连接空闲超时:60 秒
- X-Forwarded-For 标头:附加
- 跨区域负载均衡:开启
PS如果您需要有关设置的更多信息,请告诉我。
在所有目标组都健康的正常测试期间,ALB 似乎按预期运行。当我想模拟一个节点上的服务之一变得不健康的情况时,问题出现了,我更改了 ie 的运行状况检查路径api-node-1
,它显示为不健康(Error 404
),但流量仍在发送到它。通过访问日志和 CloudWatch 指标(RequestCountPerTarget
)确认。我还尝试模拟不健康的组,通过从实例中删除相关安全组来阻止 ALB 的访问。(Error 400
)
测试方法(针对不健康目标组):使用 curl(10-20 次)或 Grafana k6 负载测试并在访问日志和 Cloudwatch 中监控流量 - 流量仍然被路由到所有实例,其中一个实例显示为不健康。
您可以在此处找到讨论此问题的另一个问题的链接。