如何在Python AWS CDK中使用内在函数?

时间:2019-11-22 13:41:36

标签: python amazon-cloudformation aws-cdk

我正在尝试从Python CDK的CloudFormation中使用Amazon的内部函数,但我正努力使其正常工作。

我正在CDK中创建Lambda并添加政策声明。在此策略声明中,我将Lambda对S3操作的访问权授予了一个S3存储桶,该存储桶也在其上方的CDK中创建。我想将此Lambda权限授予 only S3存储桶资源(与使用resources="*"或其他东西相对)。我意识到在创建存储桶之前需要先使用存储桶的ARN-因此我问了一位说使用内在函数的同事(他使用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,但是我为使用它们所做的每一次尝试都失败了。

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

1 个答案:

答案 0 :(得分:1)

您应该尝试尽可能使用高级构造。 如果您在同一堆栈中创建了存储桶,则可以使用bucket_arn属性获取存储桶的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 ]
         )