AWS CDK ECS配置port_mappings提示期望数组类型报错问题
问题描述
使用AWS CDK的ecs.TaskDefinition为容器配置端口规则时,已构造ecs.PortMapping实例传入port_mappings参数,运行时持续抛出「期望数组类型」的类型错误,尝试多种实现方案均未解决。
完整报错栈信息如下:
File "/home/user/.local/share/virtualenvs/AWS_Automation--K5ZV1iW/lib/python3.9/site-packages/aws_cdk/aws_ecs/__init__.py", line 27675, in add_container return typing.cast(ContainerDefinition, jsii.invoke(self, "addContainer", [id, props])) File "/home/user/.local/share/virtualenvs/AWS_Automation--K5ZV1iW/lib/python3.9/site-packages/jsii/_kernel/__init__.py", line 143, in wrapped return _recursize_dereference(kernel, fn(kernel, *args, **kwargs)) File "/home/user/.local/share/virtualenvs/AWS_Automation--K5ZV1iW/lib/python3.9/site-packages/jsii/_kernel/__init__.py", line 355, in invoke response = self.provider.invoke( File "/home/user/.local/share/virtualenvs/AWS_Automation--K5ZV1iW/lib/python3.9/site-packages/jsii/_kernel/providers/process.py", line 359, in invoke return self._process.send(request, InvokeResponse) File "/home/user/.local/share/virtualenvs/AWS_Automation--K5ZV1iW/lib/python3.9/site-packages/jsii/_kernel/providers/process.py", line 326, in send raise JSIIError(resp.error) from JavaScriptError(resp.stack) jsii.errors.JSIIError: Expected array type, got {"$jsii.struct":{"fqn":"aws-cdk-lib.aws_ecs.PortMapping","data":{"containerPort":8501,"hostPort":null,"protocol":null}}}
涉及业务代码如下:
from aws_cdk import (aws_ec2 as ec2, aws_ecs as ecs, aws_ecs_patterns as ecs_patterns, aws_ecs as ecs, aws_ecr as ecr, aws_route53 as route53, aws_certificatemanager as certificatemanager, aws_elasticloadbalancingv2 as elbv2) container_port_mappings = ecs.PortMapping(container_port = 8501) task_def = ecs.TaskDefinition(self, 'TD', compatibility = ecs.Compatibility.FARGATE, cpu = '512', memory_mib = '1024' ) task_def.add_container("SL_container", image=ecs.ContainerImage.from_ecr_repository(_repo), port_mappings = container_port_mappings )
根因分析
add_container方法的port_mappings参数要求传入PortMapping类型对象组成的列表,不支持直接传入单个PortMapping实例。现有代码直接将单个ecs.PortMapping实例赋值给port_mappings,与参数要求的数组类型不匹配,直接触发类型错误。
修复方案
将PortMapping实例包裹在列表中传入即可,即使只配置单个端口映射也需要使用列表包裹。修正后的核心代码如下:
# 清理重复导入的aws_ecs项 from aws_cdk import (aws_ec2 as ec2, aws_ecs as ecs, aws_ecs_patterns as ecs_patterns, aws_ecr as ecr, aws_route53 as route53, aws_certificatemanager as certificatemanager, aws_elasticloadbalancingv2 as elbv2) # 端口映射放在列表内传递 container_port_mappings = [ecs.PortMapping(container_port = 8501)] task_def = ecs.TaskDefinition(self, 'TD', compatibility = ecs.Compatibility.FARGATE, cpu = '512', memory_mib = '1024' ) task_def.add_container("SL_container", image=ecs.ContainerImage.from_ecr_repository(_repo), port_mappings = container_port_mappings )
- 多端口配置说明:如果需要为同一个容器配置多个端口映射,直接在列表内追加PortMapping实例即可,示例:
container_port_mappings = [ ecs.PortMapping(container_port = 8501), ecs.PortMapping(container_port = 9000) ]
内容的提问来源于stack exchange,提问作者A Simple Programmer
相关产品推荐
相关产品推荐

