首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >aws Fn.import_value返回令牌,忽略桶名的cloudformation输出,并显示令牌

aws Fn.import_value返回令牌,忽略桶名的cloudformation输出,并显示令牌
EN

Stack Overflow用户
提问于 2022-09-05 00:15:54
回答 1查看 118关注 0票数 0

成功地"cdk部署CdkS3Stack“之后,输出将在CloudFormationConsole和cdk输出中正确显示。

代码语言:javascript
复制
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和命令行输出中正确地显示了输出。

代码语言:javascript
复制
protobucket ${Token[TOKEN.255]}
jsonbucket ${Token[TOKEN.256]}    
protobucketarn ${Token[TOKEN.257]}

最后,下面的堆栈在部署阶段"cdk部署CdkLambdaStack“上失败,并出现错误”named“。我们试图在lambda堆栈中使用Fn.import_value获取上面的输入的代码如下:

代码语言:javascript
复制
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 
代码语言:javascript
复制
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堆栈中的交叉堆栈引用)指示的行来读取输出,那么就没有错误。

EN

回答 1

Stack Overflow用户

发布于 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")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73603588

复制
相关文章

相似问题

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