如何使用CDK和TypeScript将亚马逊云科技提供的kinesis-video-producer-sdk-cpp-amazon-linux Docker镜像部署到Fargate?

0

【以下的问题经过翻译处理】 我正在尝试进行一个概念验证,将RTSP视频流导入Kinesis Video。 [这里的文档](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-gstreamer-plugin.html)提到一个Docker镜像,似乎有我需要的一切,由亚马逊云科技托管在546150905175.dkr.ecr.us-west-2.amazonaws.com上。 然而,我遇到的问题是如何使该部署(通过TypeScript CDK中的Amplify Custom类别)工作。

从Amplify push开始,它只是保持“进行中”状态,直到一个小时后我进入CloudFormation控制台并取消堆栈更新,但在ECS控制台中找到了一个实际的错误消息:

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-west-2.amazonaws.com/": dial tcp 52.94.177.118:443: i/o timeout

这对我来说逻辑是对的,因为我确实没有给它密钥,我也尝试过不同的变化:

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

const kinesisUserAccessKey = new iam.AccessKey(this, 'KinesisStreamUserAccessKey', {
    user: kinesisStreamUser,
})

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,
})

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',
        `access-key="${kinesisUserAccessKey.accessKeyId}"`,
        `secret-key="${kinesisUserAccessKey.secretAccessKey.toString()}"`,
        `aws-region="${REGION}"`,
        // `aws-region="${cdk.Aws.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)),
    }
})

所以这显然是某种网络问题,但我不确定该如何解决。任何帮助都会很有价值,这是我第一次使用Amplify和CDK项目,虽然到目前为止我已经在没有任何帮助的情况下成功度过了很多难关,但还是想不出前进的方向。

1 回答
0

【以下的回答经过翻译处理】 找到问题的解决方案了,只需要设置一个执行角色(如上所述),并在服务中设置assignPublicIp: true。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则