下面是代码,这是引用正式文档后拼凑而成的:
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参数。
错误:
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错误?
发布于 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更合适。下面是一个示例:
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,
)可以通过提供上下文来运行它,例如:
cdk synth --context image_name=xxxxx --context vpc_id=xxxxxhttps://stackoverflow.com/questions/65972127
复制相似问题