首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDK Fargate:将子域映射到不同的容器端口

CDK Fargate:将子域映射到不同的容器端口
EN

Stack Overflow用户
提问于 2021-10-27 13:23:42
回答 1查看 199关注 0票数 0

看看下面的CDK堆栈定义:

代码语言:javascript
复制
export class AwsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const myHostedZone = new route53.HostedZone(this, "HostedZone", {
      zoneName: domain,
    });

    const certificate = new acm.Certificate(this, "Certificate", {
      domainName: `*.${domain}`,
      validation: acm.CertificateValidation.fromDns(myHostedZone),
    });

    const image = new ecr.DockerImageAsset(this, "Image", { directory: "." });

    const vpc = new ec2.Vpc(this, "ApplicationVpc", { maxAzs: 2 });

    const cluster = new ecs.Cluster(this, "Cluster", {
      clusterName: "Cluster",
      vpc,
    });

    const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef");
    taskDefinition.addContainer("DefaultContainer", {
      image: ecs.ContainerImage.fromDockerImageAsset(image),
      portMappings: [
        { containerPort: 3000, hostPort: 3000 },
        { containerPort: 3001, hostPort: 3001 },
      ],
    });

    const service = new ecsPatterns.ApplicationLoadBalancedFargateService(this, "Service", {
      cluster,
      publicLoadBalancer: true,
      taskDefinition,
      certificate,
    });

    service.loadBalancer.addRedirect()

    service.listener.addTargets("api", {
      priority: 10,
      conditions: [elb.ListenerCondition.hostHeaders([`api.${domain}`])],
      // what to do???
    });
  }
}

我希望将带有api.domain的传入流量映射到端口3001,其他所有内容都应该映射到端口3000。

我如何才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-27 20:36:17

我能够用下面的方法解决这个问题

代码语言:javascript
复制
export class AwsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const zone = new route53.HostedZone(this, "HostedZone", {
      zoneName: domain,
    });

    //const certificate = acm.Certificate.fromCertificateArn(this, "Certificate", certificateArn);

    const certificate = new acm.Certificate(this, "Certificate", {
      domainName: domain,
      subjectAlternativeNames: [`*.${domain}`],
      validation: acm.CertificateValidation.fromDns(zone),
    });

    const image = new ecr.DockerImageAsset(this, "Image", { directory: "." });

    const vpc = new ec2.Vpc(this, "ApplicationVpc", { maxAzs: 2 });

    const cluster = new ecs.Cluster(this, "Cluster", {
      clusterName: "Cluster",
      vpc,
    });

    const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef");
    taskDefinition.addContainer("DefaultContainer", {
      image: ecs.ContainerImage.fromDockerImageAsset(image),
      portMappings: [
        { containerPort: 3000, hostPort: 3000 },
        { containerPort: 3001, hostPort: 3001 },
      ],
      logging: new ecs.AwsLogDriver({
        streamPrefix: domain,
      }),
    });

    const service = new ecs.FargateService(this, "Service", {
      cluster,
      taskDefinition,
      assignPublicIp: true,
    });

    const lb = new elb.ApplicationLoadBalancer(this, "LoadBalancer", {
      vpc,
      internetFacing: true,
    });

    const listener = lb.addListener("Listener", {
      port: 443,
      certificates: [certificate],
    });

    listener.addTargets("API", {
      priority: 10,
      conditions: [elb.ListenerCondition.hostHeaders([`api.${domain}`])],
      port: 80,
      targets: [service.loadBalancerTarget({ containerName: "DefaultContainer", containerPort: 3001 })],
      healthCheck: {
        healthyHttpCodes: "200-399",
      },
    });

    listener.addTargets("UI", {
      port: 80,
      targets: [service.loadBalancerTarget({ containerName: "DefaultContainer", containerPort: 3000 })],
      healthCheck: {
        healthyHttpCodes: "200-399",
      },
    });

    new route53.ARecord(this, "AliasRecord", {
      zone,
      target: route53.RecordTarget.fromAlias(new alias.LoadBalancerTarget(lb)),
    });

    new route53.ARecord(this, "AliasRecordAPI", {
      recordName: `api.${domain}`,
      zone,
      target: route53.RecordTarget.fromAlias(new alias.LoadBalancerTarget(lb)),
    });
  }
}

我仍然想知道为什么listener.addTargets需要端口80

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69739519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档