成功地"cdk部署CdkS3Stack“之后,输出将在CloudFormationConsole和cdk输出中正确显示。
from aws_cdk import (
Stack,
aws_s3 as _s3,
CfnOutput
)
from constructs import Construct
class CdkS3Stack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
bucket_proto = _s3.Bucket(self, id = "protoBucket",
block_public_access=_s3.BlockPublicAccess.BLOCK_ALL,
encryption=_s3.BucketEncryption.S3_MANAGED,
versioned=False
)
bucket_json = _s3.Bucket(self, id = "jsonBucket",
block_public_access = _s3.BlockPublicAccess.BLOCK_ALL,
encryption=_s3.BucketEncryption.S3_MANAGED,
versioned=False
)
# #Output of created resource
CfnOutput(scope=self, id='PROTOBUCKETNAME',
value=bucket_proto.bucket_name)
CfnOutput(scope=self, id='PROTOBUCKETARN',
value=bucket_proto.bucket_arn)
CfnOutput(scope=self, id='JSONBUCKETNAME',
value=bucket_json.bucket_name)
CfnOutput(scope=self, id='JSONBUCKETARN',
value=bucket_json.bucket_arn)**然而,当我试图访问输出时,在正确获取输入时会出现问题。print语句显示如下,尽管在cloudformation和命令行输出中正确地显示了输出。
protobucket ${Token[TOKEN.255]}
jsonbucket ${Token[TOKEN.256]}
protobucketarn ${Token[TOKEN.257]}最后,下面的堆栈在部署阶段"cdk部署CdkLambdaStack“上失败,并出现错误”named“。我们试图在lambda堆栈中使用Fn.import_value获取上面的输入的代码如下:
CdkLambdaStack: creating CloudFormation changeset...
CdkLambdaStack | 0/10 | 1:50:25 AM | UPDATE_IN_PROGRESS | AWS::CloudFormation::Stack | CdkLambdaStack User Initiated
CdkLambdaStack | 0/10 | 1:50:28 AM | UPDATE_ROLLBACK_IN_P | AWS::CloudFormation::Stack | CdkLambdaStack No export named PROTOBUCKETARN foundCdkLambdaStack | 1/10 | 1:50:33 AM | UPDATE_ROLLBACK_COMP | AWS::CloudFormation::Stack | CdkLambdaStack
CdkLambdaStack | 2/10 | 1:50:33 AM | UPDATE_ROLLBACK_COMP | AWS::CloudFormation::Stack | CdkLambdaStack from aws_cdk import (
Stack,
aws_lambda as _lambda,
aws_iam as _iam,
Fn,
aws_s3 as _s3,
aws_s3_notifications as _s3n
#CfnOutput
)
from constructs import Construct
class CdkLambdaStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
#Create role for your Lambda function
lambda_role = _iam.Role(scope=self, id='cdk-lambda-role',
assumed_by =_iam.ServicePrincipal('lambda.amazonaws.com'),
role_name='cdk-lambda-role',
managed_policies=[
_iam.ManagedPolicy.from_aws_managed_policy_name(
'AWSLambda_FullAccess'),
_iam.ManagedPolicy.from_aws_managed_policy_name(
'CloudWatchFullAccess'),
_iam.ManagedPolicy.from_aws_managed_policy_name(
'AmazonS3FullAccess')
])
lambdaLayer = _lambda.LayerVersion(self, 'lambda-layer',
code = _lambda.AssetCode('./cdk_lambda_stack/lambda/layer/'),
compatible_runtimes = [_lambda.Runtime.PYTHON_3_9],
)
proto_bucket = Fn.import_value("PROTOBUCKETNAME") <----
json_bucket = Fn.import_value("JSONBUCKETNAME") <----
proto_bucket_arn = Fn.import_value("PROTOBUCKETARN") <----
print("protobucket", proto_bucket)
print("jsonbucket", json_bucket)
print("protobucketarn", proto_bucket_arn)
# Defines an AWS Lambda resource
cdk_lambda = _lambda.Function(
self, 'cdk-lambda-func',
runtime=_lambda.Runtime.PYTHON_3_9,
function_name='cdk-lambda-function',
description='Lambda function deployed using AWS CDK Python',
code=_lambda.Code.from_asset('./cdk_lambda_stack/lambda/code'),
handler='my_lambda_code.lambda_handler',
role=lambda_role,
layers = [lambdaLayer],
environment={
'NAME': 'cdk-lambda-function-env',
'PROTO_BUCKET': proto_bucket,
'JSON_BUCKET': json_bucket
}
)
proto_bucket_ref = _s3.Bucket.from_bucket_arn(self, id = "protoBucket-abc",
bucket_arn = proto_bucket_arn) <------
proto_bucket_ref.add_event_notification(_s3.EventType.OBJECT_CREATED,
_s3n.LambdaDestination(cdk_lambda)) <-------我做错什么了?输出应该在那里,可以看到。如果我注释掉用箭头(即lambda堆栈中的交叉堆栈引用)指示的行来读取输出,那么就没有错误。。
发布于 2022-09-05 12:01:17
输出应该使用export_name完成,而Fn.import_value应该在另一个堆栈中使用export_name完成:
堆栈1:
CfnOutput(scope=self,id='PROTOBUCKETNAME',export_name="ProtoBuf:BucketName",description=“Probuf桶名”,value=bucket_proto.bucket_name)
第2组:
proto_bucket_name = Fn.import_value("ProtoBuf:BucketName")
https://stackoverflow.com/questions/73603588
复制相似问题