我最近在CDK github帐户上提出了一个功能请求,并指出了Core.Token的方向,因为它几乎是我正在寻找的确切功能。我现在在实现它时遇到了一些问题,并且遇到了类似的错误,这是我之前提出的功能请求:https://github.com/aws/aws-cdk/issues/3800
所以我当前的代码如下:
fargate_service = ecs_patterns.LoadBalancedFargateService(
self, "Fargate",
cluster = cluster,
memory_limit_mib = core.Token.as_number(ssm.StringParameter.value_from_lookup(self, parameter_name='template-service-memory_limit')),
execution_role=fargate_iam_role,
container_port=core.Token.as_number(ssm.StringParameter.value_from_lookup(self, parameter_name='port')),
cpu = core.Token.as_number(ssm.StringParameter.value_from_lookup(self, parameter_name='template-service-container_cpu')),
image=ecs.ContainerImage.from_registry(ecrRepo)
)
当我尝试综合此代码时,出现以下错误:
jsii.errors.JavaScriptError:
Error: Resolution error: Supplied properties not correct for "CfnSecurityGroupEgressProps"
fromPort: "dummy-value-for-template-service-container_port" should be a number
toPort: "dummy-value-for-template-service-container_port" should be a number.
Object creation stack:
对我来说,它似乎已超出要求将数字传递到FargateService验证中的验证,但是当它试图在此之后创建资源时(“ CfnSecurityGroupEgressProps”),它无法将虚拟字符串解析为数字。我很乐意解决此建议或其他建议,而不是从AWS系统参数传递值的任何帮助(我认为,可能可以通过在构建管道期间从S3提取的文件或沿着这些行的内容将值解析到此处,但这似乎很骇人。)
答案 0 :(得分:0)
在一些帮助下,我认为我们已经破解了!
问题是我传递了“ 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代码的通用模板的方法的人们提供了一些有用的信息!我不知道我们在这里做的事是否正确,但是这个工具太新了,感觉有些不常见的模式。