为了账号安全,请及时绑定邮箱和手机立即绑定

使用 core.Token 将字符串参数作为数字传递

使用 core.Token 将字符串参数作为数字传递

眼眸繁星 2022-05-19 14:14:03
我最近在 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 提取的文件或类似的东西将值解析到此处,但这似乎很老套)。
查看完整描述

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 代码的通用模板的人提供了一些有用的信息!我不知道我们在这里做的是否正确,但这个工具太新了,感觉有些常见的模式还不存在。


查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号