1 回答

TA贡献1829条经验 获得超4个赞
在一些帮助下,我认为我们已经解决了这个问题!
问题是我正在传递“ssm.StringParameter.value_from_lookup”,解决方案是为令牌提供“ssm.StringParameter.value_for_string_parameter”,当它被合成时它存储令牌,然后在部署时存储在系统参数存储中的值是代替。
(我们还提出了另一种实现类似的方法,我们可能会在 SSM 方法上使用它,如果您有兴趣,我在下面的代码片段中有详细说明)
请参阅下面的完整代码:
from aws_cdk import (
aws_ec2 as ec2,
aws_ssm as ssm,
aws_iam as iam,
aws_ecs as ecs,
aws_ecs_patterns as ecs_patterns,
core,
)
class GenericFargateService(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
containerPort = core.Token.as_number(ssm.StringParameter.value_for_string_parameter(
self, 'template-service-container_port'))
vpc = ec2.Vpc(
self, "cdk-test-vpc",
max_azs=2
)
cluster = ecs.Cluster(
self, 'cluster',
vpc=vpc
)
fargate_iam_role = iam.Role(self,"execution_role",
assumed_by = iam.ServicePrincipal("ecs-tasks"),
managed_policies=[iam.ManagedPolicy.from_aws_managed_policy_name("AmazonEC2ContainerRegistryFullAccess")]
)
fargate_service = ecs_patterns.LoadBalancedFargateService(
self, "Fargate",
cluster = cluster,
memory_limit_mib = 1024,
execution_role=fargate_iam_role,
container_port=containerPort,
cpu = 512,
image=ecs.ContainerImage.from_registry("000000000000.dkr.ecr.eu-west-1.amazonaws.com/template-service-ecr")
)
fargate_service.target_group.configure_health_check(path=self.node.try_get_context("health_check_path"), port="9000")
app = core.App()
GenericFargateService(app, "generic-fargate-service", env={'account':'000000000000', 'region': 'eu-west-1'})
app.synth()
问题的解决方案就像公共汽车,显然你花了很长时间等待一辆,然后两辆一起到达。我认为这辆新巴士是我们可能会选择的选择。
计划是让开发人员使用他们的代码库为 cdk.json 文件提供覆盖,然后可以将解析后的文件放入 CDK 管道中,在其中合成通用代码。该文件将包含一些“上下文”,然后将在 CDK 中使用该上下文来设置 LoadBalancedFargate 服务的变量。
我已经包含了一些代码片段,用于设置 cdk.json 文件,然后在下面的代码中使用它的值。
示例 CDK.json:
{
"app": "python3 app.py",
"context": {
"container_name":"template-service",
"memory_limit":1024,
"container_cpu":512,
"health_check_path": "/gb/template/v1/status",
"ecr_repo": "000000000000.dkr.ecr.eu-west-1.amazonaws.com/template-service-ecr"
}
}
将上下文分配给变量的 Python 示例:
memoryLimitMib = self.node.try_get_context("memory_limit")
我相信如果开发人员在他们的 CDK.json 文件中没有提供一些默认值,我们也可以使用 Try/Catch 块为其分配一些默认值。
我希望这篇文章为那些寻找方法来创建用于部署 CDK 代码的通用模板的人提供了一些有用的信息!我不知道我们在这里做的是否正确,但这个工具太新了,感觉有些常见的模式还不存在。
添加回答
举报