【问题标题】:How to use Intrinsic Functions in Python AWS CDK?如何在 Python AWS CDK 中使用内部函数?
【发布时间】:2020-03-18 14:25:09
【问题描述】:

我正在尝试在 Python CDK 中使用来自 CloudFormation 的 Amazon 的内在函数,但我很难让它发挥作用。

我正在 CDK 中创建一个 Lambda 并添加一个策略声明。在此政策声明中,我授予 Lambda 对 S3 存储桶的 S3 操作的访问权限该存储桶也是在其上方的 CDK 中创建的。我想将此 lambda 权限授予S3 存储桶资源(而不是使用 resources="*" 或其他东西)。我意识到在创建存储桶之前我需要它的 ARN - 所以我问了一位同事,他说要使用 Intrinsic Functions(他使用 CloudFormation 但没有使用 CDK)。

这是我卡住的地方 - 我不知道如何使用内部函数来获取存储桶 ARN 并将其放入策略声明的资源中。

这是我的代码:

bucket_arn = core.Fn.get_att("BucketIDHere", "Arn")

event_lambda.add_to_role_policy(
    aws_iam.PolicyStatement(
        effect=aws_iam.Effect.ALLOW,
        actions=[
            "s3:PutObject", "s3:GetObject", "s3:DeleteObject",
            "s3:ListBucket", "secretsmanager:GetSecretValue", "kms:*"
        ],
        resources=[
            bucket_arn
        ]))

但我得到了

raise JSIIError(resp.error) from JavaScriptError(resp.stack)
jsii.errors.JSIIError: Expected Scalar, got {"$jsii.byref":"@aws-cdk/core.Intrinsic@10012"}

当我尝试cdk diff 时。我了解我没有正确获取 ARN,但我不知道如何获取它。我已阅读文档并知道我可能必须使用 IResolveableIResolveContext,但我使用它们的每一次尝试都失败了。

如果有人有示例或解决方案,将不胜感激!

【问题讨论】:

    标签: python amazon-cloudformation aws-cdk


    【解决方案1】:

    您应该尽可能多地使用高级构造。 如果在同一个栈中创建了bucket,可以通过bucket_arn属性获取bucket的ARN。

    my_bucket = _s3.Bucket(self, "my_bucket")
    arn = my_bucket.bucket_arn
    

    如果存储桶不属于您的堆栈,您也可以将它作为资源导入。

    from aws_cdk import aws_s3 as _s3
    ...
     def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
         bucket = _s3.Bucket.from_bucket_name(self, "an-identifier", "my-bucket-name")
    
         event_lambda.add_to_role_policy(
             aws_iam.PolicyStatement(
                ...
                resources=[ bucket.bucket_arn ]
             )
    
    

    【讨论】:

    • 但我认为this 的全部意义在于它可以解析模板中另一个资源的 ARN(即尚未创建)
    • 我明白你的意思。您是否尝试过使用 bucket_arn 属性?我已经相应地更新了我的答案。
    • 哦对了!我现在就试一试并更新结果。编辑:成功了!非常感谢。我没有意识到我之前在堆栈中创建的存储桶具有该属性!很高兴知道这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-04-08
    • 2020-04-25
    • 2022-12-06
    • 2020-03-10
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多