- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我更改了 CDK 部署代码以使其更加模块化。因此,我将任务定义和 FargateService 代码移至单独的类 EcsService 中。进行这些更改后,堆栈部署由于 ECS 而陷入停滞。原因是由于某些权限或网络问题,taskdef 无法获取图像。错误如下所示。我的旧代码和新代码都在错误消息下方。
Task stopped at: 2023-08-31T05:55:55.882Z
ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post "https://api.ecr.us-east-1.amazonaws.com/": dial tcp 44.213.79.50:443: i/o timeout. Please check your task network configuration.
securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(3000));
// Validation
if (!envJSON.ssdDockerImageTag ) {
throw new Error('Missing ssd-fe image tag.');
}
const cluster = new ecs.Cluster(this, "ssdCluster", { vpc });
// Define the task definition with a container using an image from ECR
const taskDefinition = new ecs.FargateTaskDefinition(this, 'ssdTaskDef');
const container = taskDefinition.addContainer('ssdContainer', {
image: ecs.ContainerImage.fromEcrRepository(
ecr.Repository.fromRepositoryName(this, 'ssdRepo', 'ssd-fe'),
envJSON.ssdDockerImageTag),
memoryLimitMiB: 512,
cpu: 256,
portMappings: [{
containerPort: 3000
}],
environment: {
NODE_ENV: "production",
API_BASE_URL: api.url
}
});
// Create the Fargate Service
const service = new ecs.FargateService(this, 'ssdService', {
cluster,
taskDefinition,
desiredCount: 1,
vpcSubnets: {
subnetType: ec2.SubnetType.PUBLIC,
},
securityGroups: [securityGroup],
assignPublicIp: true,
});
LoadBalancer.getInstance(this, 'LoadBalancer', {
vpc,
ecsService: service,
});
securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(3000));
// Validation
if (!envJSON.ssdDockerImageTag ) {
throw new Error('Missing ssd-fe image tag.');
}
const cluster = new ecs.Cluster(this, "ssdCluster", { vpc });
// Create ECS Service
const ecsService = new EcsService(this, 'ssdService', {
vpc,
securityGroup: securityGroup,
cluster: cluster,
repoName: 'ssd-fe',
imageTag: envJSON.ssdDockerImageTag,
environment: {
NODE_ENV: "production",
API_BASE_URL: api.url
}
});
LoadBalancer.getInstance(this, 'LoadBalancer', {
vpc,
ecsService: ecsService.service,
});
// EcsService class
import * as cdk from 'aws-cdk-lib';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecr from 'aws-cdk-lib/aws-ecr';
import * as logs from 'aws-cdk-lib/aws-logs';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Construct } from 'constructs';
interface EcsServiceProps {
vpc: ec2.IVpc;
securityGroup: ec2.ISecurityGroup;
cluster: ecs.ICluster;
repoName: string;
imageTag: string;
environment?: { [key: string]: string };
}
export class EcsService extends Construct {
public readonly service: ecs.FargateService;
constructor(scope: Construct, id: string, props: EcsServiceProps) {
super(scope, id);
const ecrRepository = ecr.Repository.fromRepositoryName(this, `${id}Repo`, props.repoName);
const taskDefinition = new ecs.FargateTaskDefinition(this, `${id}TaskDef`);
taskDefinition.addContainer(`${id}Container`, {
image: ecs.ContainerImage.fromEcrRepository(ecrRepository, props.imageTag),
memoryLimitMiB: 512,
cpu: 256,
portMappings: [{ containerPort: 3000 }],
environment: props.environment,
});
this.service = new ecs.FargateService(this, id, {
cluster: props.cluster,
taskDefinition,
desiredCount: 1,
vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },
securityGroups: [props.securityGroup],
});
}
}
┌───┬───────────────────────────────────────┬────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────┐
│ │ Resource │ Effect │ Action │ Principal │ Condition │
├───┼───────────────────────────────────────┼────────┼───────────────────────────────────────┼───────────────────────────────────────┼───────────┤
│ - │ * │ Allow │ ecr:GetAuthorizationToken │ AWS:${ssdTaskDefExecutionRole469C7625 │ │
│ │ │ │ │ } │ │
├───┼───────────────────────────────────────┼────────┼───────────────────────────────────────┼───────────────────────────────────────┼───────────┤
│ - │ arn:aws:ecr:us-east-1:533732470418:re │ Allow │ ecr:BatchCheckLayerAvailability │ AWS:${ssdTaskDefExecutionRole469C7625 │ │
│ │ pository/ssd-fe │ │ ecr:BatchGetImage │ } │ │
│ │ │ │ ecr:GetDownloadUrlForLayer │ │ │
├───┼───────────────────────────────────────┼────────┼───────────────────────────────────────┼───────────────────────────────────────┼───────────┤
│ + │ ${ssdService/ssdServiceTaskDef/Execut │ Allow │ sts:AssumeRole │ Service:ecs-tasks.amazonaws.com │ │
│ │ ionRole.Arn} │ │ │ │ │
├───┼───────────────────────────────────────┼────────┼───────────────────────────────────────┼───────────────────────────────────────┼───────────┤
│ + │ ${ssdService/ssdServiceTaskDef/TaskRo │ Allow │ sts:AssumeRole │ Service:ecs-tasks.amazonaws.com │ │
│ │ le.Arn} │ │ │ │ │
├───┼───────────────────────────────────────┼────────┼───────────────────────────────────────┼───────────────────────────────────────┼───────────┤
│ + │ * │ Allow │ ecr:GetAuthorizationToken │ AWS:${ssdService/ssdServiceTaskDef/Ex │ │
│ │ │ │ │ ecutionRole} │ │
├───┼───────────────────────────────────────┼────────┼───────────────────────────────────────┼───────────────────────────────────────┼───────────┤
│ + │ arn:aws:ecr:us-east-1:533732470418:re │ Allow │ ecr:BatchCheckLayerAvailability │ AWS:${ssdService/ssdServiceTaskDef/Ex │ │
│ │ pository/ssd-fe │ │ ecr:BatchGetImage │ ecutionRole} │ │
│ │ │ │ ecr:GetDownloadUrlForLayer │ │ │
└───┴───────────────────────────────────────┴────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────┘
ChatGPT 建议我明确地在 EcsService 类中添加权限,因此我进行了以下更改。但即使在这些更改之后,错误仍然是相同的。
// Create an execution role
const executionRole = new iam.Role(this, 'ExecutionRole', {
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
});
// Grant permissions to the execution role to pull from ECR
executionRole.addToPolicy(new iam.PolicyStatement({
actions: [
'ecr:GetAuthorizationToken'
],
resources: ['*'],
}));
const ecrRepository = ecr.Repository.fromRepositoryName(this, `${id}Repo`, props.repoName);
const taskDefinition = new ecs.FargateTaskDefinition(this, `${id}TaskDef`, {
executionRole: executionRole
});
如何解决这个问题?
最佳答案
在@gshpychka的帮助下,我可以解决这个问题。这是我的做法。
该问题与 ECS 任务访问互联网以从 ECR 提取 Docker 镜像的能力有关。当我重构代码时,我无意中从 Fargate 服务构造函数中删除了 allocatePublicIp: true 属性,认为这是不必要的。
为了解决该问题,我在 Fargate 服务构造函数中重新添加了 allocatePublicIp: true,如下所示:
this. Service = new ecs.FargateService(this, id, {
cluster: props. Cluster,
taskDefinition,
desiredCount: 1,
assignPublicIp: true // This line solved the issue
});
添加此属性可确保 ECS 任务具有 Internet 访问权限,从而使其能够成功拉取 Docker 镜像。
PS:我还删除了 vpcSubnets
和 securityGroups
属性。这些都是不必要的。
关于amazon-web-services - CDK重构导致ECS任务失败: Unable to Retrieve ECR Registry Auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77013257/
尽管我的 EC2 实例(带有针对 ECS 优化的 AIM)正在运行 ecs 代理,但容器并未在我的 EC2 中启动。为了确认 ecs-agent 正在我的 EC2 实例上运行,我检查了: ecs 日志
我想在一个任务定义中使用客户端和服务器在 aws ecs 中运行套接字程序。当我使用 awsvpc 网络模式并每次连接到本地主机上的服务器时,我都可以运行它。这很好,所以我不需要知道服务器的 IP 地
我有一个在 AWS ECS 上运行的 Docker 容器。我不想要负载均衡器,因为容器是用来处理 websocket 连接的。 https://aws.amazon.com/getting-start
我想在我的 AWS ECS/Fargate 集群上的公共(public) Docker 镜像中启动交互式 shell,以便从集群内部运行网络/连接测试。 似乎官方的方法是使用 aws ecs run-
我在 ECS Fargate 上托管了一个 Shiny 的应用程序。它运行得相当好,但偶尔在使用该应用程序时它会崩溃。我在事件选项卡中将其追溯到以下内容: service YYYY has start
在 AWS ECS 中创建容量提供程序时。我们正在填充的值 Target capacity %,在超过这个值后我们的集群缩小,但我很好奇当前集群的这个值是如何计算的,如果我想检查当前的是什么集群的值(
在 AWS ECS 中创建容量提供程序时。我们正在填充的值 Target capacity %,在超过这个值后我们的集群缩小,但我很好奇当前集群的这个值是如何计算的,如果我想检查当前的是什么集群的值(
我在 AWS 上设置了具有多个目标组和应用程序负载均衡器的 Fargate ecs 服务。它按预期运行。 然后我尝试使用本教程设置管道 https://docs.aws.amazon.com/Amaz
我有一个运行任务的 ECS 集群服务,可以使用 AWS 控制台查看其 Cloudwatch 日志流。 如何为 awslogs-stream-prefix 设置日期,因为我想按日期识别日志流。 "c
我正在使用两个容器部署 ECS Fargate 任务:1 个反向代理 nginx 和 1 个 python 服务器。对于每个我有一个 ECR 存储库,我有一个 CI/CD CodePipeline 设
我在 AWS ECS 上部署了一个 CloudFormation 堆栈,比如 teststack , 通过命令 aws cloudformation deploy --template-file ./
我这里有一些具体的用例。我需要自动扩展在 ECS Fargate 上运行的分布式 Web 应用程序。问题是所有节点都需要在内存中保留相同的数据(因此增加节点数量无助于内存压力)。因此,只有在水平(添加
我正在寻找有关为 ECS 任务分配内存的指南。我正在为希望在服务器成本上尽可能便宜的客户运行 Rails 应用程序。我正在查看具有 2 个 CPU 和 4 GB 内存的中等服务器大小。 大多数情况下,
我是 ECS 新手,我正在尝试使用 Cloudformation 部署它。 我通过查看文档以及从博客和一些文章中找到的一些示例来制作以下 cloudformation 模板。 但是,由于某种原因,它在
也许这很愚蠢,但如果我创建一个 ECS 任务定义(例如参见 https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aw
ECS 的容器定义允许您指定 memoryReservation对于每个容器: The soft limit (in MiB) of memory to reserve for the contain
我在 ca-central 区域创建了一个 AWS ECS 实例。它与每次更新服务时都会更改的动态公共(public) ip 一起使用。到目前为止一切都很好。 由于需要一个公网静态IP,所以我在同一区
Invalid 'containerPort' setting for container 'prerenderContainer'.(Service: AmazonECS; Status Code:
如果我在 ECS 服务级别进行自动扩展,我看不到使用容量提供程序扩展 ECS 集群的意义: https://docs.aws.amazon.com/AmazonECS/latest/developer
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改进这个问题?更新问题,使其成为 Stack Overflow 的 on-topic。 1年前关闭。
我是一名优秀的程序员,十分优秀!