如何在 Python AWS CDK 中使用内部函数?
How to use Intrinsic Functions in Python AWS CDK?
我正在尝试在 Python CDK 中使用来自其 CloudFormation 的亚马逊内部函数,但我正在努力让它工作。
我正在 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,但我不知道如何获取它。我已经阅读了文档并且知道我可能必须使用 IResolveable
和 IResolveContext
但是我使用它们所做的每一次尝试都失败了。
如果有人有示例或解决方案,我们将不胜感激!
您应该尽量使用高级结构。
如果您在同一个堆栈中创建了一个存储桶,您可以使用 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 ]
)
我正在尝试在 Python CDK 中使用来自其 CloudFormation 的亚马逊内部函数,但我正在努力让它工作。
我正在 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,但我不知道如何获取它。我已经阅读了文档并且知道我可能必须使用 IResolveable
和 IResolveContext
但是我使用它们所做的每一次尝试都失败了。
如果有人有示例或解决方案,我们将不胜感激!
您应该尽量使用高级结构。
如果您在同一个堆栈中创建了一个存储桶,您可以使用 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 ]
)