簡體   English   中英

如何在 Python AWS CDK 中使用內部函數?

[英]How to use Intrinsic Functions in Python AWS CDK?

我正在嘗試在 Python CDK 中使用 Amazon 的 CloudFormation 中的內在函數,但我很難讓它工作。

我正在 CDK 中創建 Lambda 並添加策略聲明。 在此策略聲明中,我授予 Lambda 對 S3 存儲桶的 S3 操作訪問權限,該存儲桶也在其上方的 CDK 中創建。 只想將此 lambda 權限授予 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但我使用它們所做的每一次嘗試都失敗了。

如果有人有一個例子或一些解決方案,將不勝感激!

您應該盡可能多地使用高級構造。 如果您在同一個堆棧中創建了一個存儲桶,您可以通過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 ]
         )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM