首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中尝试使用参数通过AWS创建EC2时出现jsii错误

在python中尝试使用参数通过AWS创建EC2时出现jsii错误
EN

Stack Overflow用户
提问于 2021-01-30 19:16:05
回答 1查看 1.2K关注 0票数 0

下面是代码,这是引用正式文档后拼凑而成的:

代码语言:javascript
复制
    image_id = core.CfnParameter(
        self,
        id='ImageName',
        type='String',
        default='MyTestImage',
        constraint_description="Must be the AMI name not the ID",
        )

    vpc_id = "vpc-XXXXXX"
    # lookup existing VPC
    vpc = ec2.Vpc.from_lookup(
        self,
        "vpc",
        vpc_id=vpc_id,
    )

    # create a new security group
    sec_group = ec2.SecurityGroup(
        self,
        "MyAppSG",
        vpc=vpc,
        allow_all_outbound=True,
    )

    ami_id = ec2.LookupMachineImage(
        name=image_id.value_as_string
    )

    ec2_instance = ec2.Instance(
        self,
        "ec2-instance",
        instance_name='Web',
        instance_type=ec2.InstanceType('t2.micro'),
        machine_image=ami_id,
        vpc=vpc,
        key_name='Mykey',
        security_group=sec_group,
    )

然后运行CDK命令: cdk diff - ImageName=MySecondTestImage参数。

错误:

代码语言:javascript
复制
Searching for AMI in XXXXXXXX:us-east-1
jsii.errors.JavaScriptError: 
  Error: Invalid context key: context keys can't include tokens
      at ConstructNode.setContext (/private/var/folders/w3/b69qmypx72nd9kk9s0vx73hdhdcs6y/T/jsii-kernel-kDU1vU/node_modules/@aws-cdk/core/lib/construct-compat.js:356:19)
      at App.loadContext (/private/var/folders/w3/b69qmypx72nd9kk9s0vx73hdhdcs6y/T/jsii-kernel-kDU1vU/node_modules/@aws-cdk/core/lib/app.js:75:23)
      at new App (/private/var/folders/w3/b69qmypx72nd9kk9s0vx73hdhdcs6y/T/jsii-kernel-kDU1vU/node_modules/@aws-cdk/core/lib/app.js:46:14)
      at /data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_embedded/jsii/jsii-runtime.js:3621:49
      at Kernel._wrapSandboxCode (/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_embedded/jsii/jsii-runtime.js:4105:16)
      at Kernel._create (/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_embedded/jsii/jsii-runtime.js:3621:26)
      at Kernel.create (/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_embedded/jsii/jsii-runtime.js:3356:21)
      at KernelHost.processRequest (/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_embedded/jsii/jsii-runtime.js:13162:28)
      at KernelHost.run (/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_embedded/jsii/jsii-runtime.js:13100:14)
      at Immediate._onImmediate (/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_embedded/jsii/jsii-runtime.js:13103:37)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/data/CDK/POC/test/app.py", line 9, in <module>
    app = core.App()
  File "/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_runtime.py", line 83, in __call__
    inst = super().__call__(*args, **kwargs)
  File "/data/CDK/POC/test/.venv/lib/python3.9/site-packages/aws_cdk/core/__init__.py", line 14940, in __init__
    jsii.create(App, self, [props])
  File "/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_kernel/__init__.py", line 265, in create
    response = self.provider.create(
  File "/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_kernel/providers/process.py", line 353, in create
    return self._process.send(request, CreateResponse)
  File "/data/CDK/POC/test/.venv/lib/python3.9/site-packages/jsii/_kernel/providers/process.py", line 335, in send
    raise JSIIError(resp.error) from JavaScriptError(resp.stack)
jsii.errors.JSIIError: Invalid context key: context keys can't include tokens
Subprocess exited with error 1

为什么会产生CDK错误?

EN

回答 1

Stack Overflow用户

发布于 2021-02-06 14:47:49

来自https://docs.aws.amazon.com/cdk/latest/guide/parameters.html

一个CfnParameter实例通过令牌向您的AWS应用程序公开它的值。与所有令牌一样,参数的令牌在合成时被解析,但它解析为对AWS CloudFormation模板中定义的参数的引用,该参数将在部署时被解析,而不是具体的值。

当合成时间尚未被解析时,您正在尝试在合成之前使用该值。对于您想要实现的运行时上下文,https://docs.aws.amazon.com/cdk/latest/guide/context.html更合适。下面是一个示例:

代码语言:javascript
复制
from aws_cdk import core
import aws_cdk.aws_ec2 as ec2


class MyCdkStack(core.Stack):

    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        image_name = self.node.try_get_context("image_name")
        vpc_id = self.node.try_get_context("vpc_id")

        # lookup existing VPC
        vpc = ec2.Vpc.from_lookup(
            self,
            "vpc",
            vpc_id=vpc_id,
        )

        # create a new security group
        sec_group = ec2.SecurityGroup(
            self,
            "MyAppSG",
            vpc=vpc,
            allow_all_outbound=True,
        )

        ami_id = ec2.LookupMachineImage(
            name=image_name
        )

        ec2_instance = ec2.Instance(
            self,
            "ec2-instance",
            instance_name='Web',
            instance_type=ec2.InstanceType('t2.micro'),
            machine_image=ami_id,
            vpc=vpc,
            key_name='Mykey',
            security_group=sec_group,
        )

可以通过提供上下文来运行它,例如:

代码语言:javascript
复制
cdk synth --context image_name=xxxxx --context vpc_id=xxxxx
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65972127

复制
相关文章

相似问题

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