You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用TypeScript CDK部署AWS ECR的Kinesis Producer镜像到Fargate遇网络问题

问题分析与解决方案

你遇到的是ECS Fargate任务无法拉取ECR镜像导致的初始化失败,核心原因是网络连通性问题,以下是具体排查和解决步骤:

1. 确认子网的网络连通性配置

  • 如果使用私有子网:必须为该子网所在可用区配置NAT网关,并且子网的路由表需设置0.0.0.0/0 -> NAT网关的路由规则,否则Fargate任务无法访问公网拉取ECR镜像。
  • 如果使用公有子网:确保子网的mapPublicIpOnLaunch属性为true,这样Fargate任务会被分配公网IP,能够直接访问ECR。

2. 使用VPC端点(推荐,无需NAT网关)

在VPC中创建ECR相关的VPC端点,让私有子网内的Fargate任务通过内网访问ECR,避免依赖公网:

  • 创建com.amazonaws.us-west-2.ecr.dkr端点(用于镜像拉取)
  • 创建com.amazonaws.us-west-2.ecr.api端点(用于ECR API认证)
    配置时需确保端点关联目标子网和允许访问的安全组。

3. 检查安全组出站规则

确保Fargate任务绑定的安全组允许出站HTTPS(443端口):

  • 若走公网访问ECR,规则可设置为0.0.0.0/0(443端口)
  • 若使用VPC端点,规则可限制为ECR端点的IP范围或VPC CIDR

4. 验证网络ACL规则

子网对应的网络ACL需要:

  • 允许出站流量(443端口)到ECR或公网
  • 允许入站流量(临时端口范围1024-65535),用于接收ECR的HTTPS响应

5. 优化IAM凭证管理(避免硬编码密钥)

不要在容器命令中硬编码Access Key和Secret Key,应为任务角色添加Kinesis Video权限,让容器自动获取凭证:

import * as iam from "@aws-cdk/aws-iam";
import * as ecs from "@aws-cdk/aws-ecs";
import * as ec2 from "@aws-cdk/aws-ec2";

// 创建任务角色,用于容器内的Kinesis Video操作
const taskRole = new iam.Role(this, 'IngestVideoTaskRole', {
    assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
    managedPolicies: [
        // 建议使用更细粒度的权限,比如仅允许PutMedia到指定流
        iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonKinesisVideoStreamsFullAccess')
    ]
});

const servicePrincipal = new iam.ServicePrincipal('ecs-tasks.amazonaws.com');
const executionRole = new iam.Role(this, 'IngestVideoTaskDefExecutionRole', {
    assumedBy: servicePrincipal,
    managedPolicies: [
        iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonECSTaskExecutionRolePolicy'),
    ]
});

const taskDefinition = new ecs.FargateTaskDefinition(this, 'IngestVideoTaskDef', {
    cpu: 512,
    memoryLimitMiB: 1024,
    executionRole,
    taskRole // 关联任务角色
})

const image = ecs.ContainerImage.fromRegistry('546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-amazon-linux:latest');

taskDefinition.addContainer('IngestVideoContainer', {
    command: [
        'gst-launch-1.0',
        'rtspsrc',
        `location="${locationParam.secretValue.toString()}"`,
        'short-header=TRUE',
        '!',
        'rtph264depay',
        '!',
        'video/x-h264,',
        'format=avc,alignment=au',
        '!',
        'kvssink',
        `stream-name="${cfnStream.name}"`,
        'storage-size=512',
        `aws-region="${REGION}"`
    ],
    image,
    logging: new ecs.AwsLogDriver({
        streamPrefix: 'IngestVideoContainer',
    }),
})

const service = new ecs.FargateService(this, 'IngestVideoService', {
    cluster,
    taskDefinition,
    desiredCount: 1,
    securityGroups: [
        ec2.SecurityGroup.fromSecurityGroupId(this, 'DefaultSecurityGroup', SECURITY_GROUP_ID)
    ],
    vpcSubnets: {
        subnets: SUBNET_IDS.map(subnetId => ec2.Subnet.fromSubnetId(this, subnetId, subnetId)),
    }
})

内容的提问来源于stack exchange,提问作者Leon Spencer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:31:57