首页 > 解决方案 > GCP - 使用 Pulumi Python 将生命周期规则分配给存储桶时出错

问题描述

我对 Python 还很陌生(我只知道了解一些基本脚本的基础知识),并且我正在尝试使用 Pulumi 将服务部署到 GCP 中。我想做的是根据本文档创建一个存储桶。

这是文档 https://www.pulumi.com/registry/packages/google-native/api-docs/storage/v1/bucket/

尝试将生命周期策略分配给存储桶时出现了主要问题。否则,我在没有它的情况下创建存储桶没有问题,但是,我希望它拥有它。

这是 Pulumi 文档中的示例

@overload
def Bucket(resource_name: str,
           opts: Optional[ResourceOptions] = None,
           acl: Optional[Sequence[BucketAccessControlArgs]] = None,
           billing: Optional[BucketBillingArgs] = None,
           cors: Optional[Sequence[BucketCorsItemArgs]] = None,
           custom_placement_config: Optional[BucketCustomPlacementConfigArgs] = None,
           default_event_based_hold: Optional[bool] = None,
           default_object_acl: Optional[Sequence[ObjectAccessControlArgs]] = None,
           encryption: Optional[BucketEncryptionArgs] = None,
           etag: Optional[str] = None,
           iam_configuration: Optional[BucketIamConfigurationArgs] = None,
           id: Optional[str] = None,
           kind: Optional[str] = None,
           labels: Optional[Mapping[str, str]] = None,
           lifecycle: Optional[BucketLifecycleArgs] = None,
           location: Optional[str] = None,
           location_type: Optional[str] = None,
           logging: Optional[BucketLoggingArgs] = None,
           metageneration: Optional[str] = None,
           name: Optional[str] = None,
           owner: Optional[BucketOwnerArgs] = None,
           predefined_acl: Optional[str] = None,
           predefined_default_object_acl: Optional[str] = None,
           project: Optional[str] = None,
           project_number: Optional[str] = None,
           projection: Optional[str] = None,
           provisional_user_project: Optional[str] = None,
           retention_policy: Optional[BucketRetentionPolicyArgs] = None,
           rpo: Optional[str] = None,
           satisfies_pzs: Optional[bool] = None,
           self_link: Optional[str] = None,
           storage_class: Optional[str] = None,
           time_created: Optional[str] = None,
           updated: Optional[str] = None,
           user_project: Optional[str] = None,
           versioning: Optional[BucketVersioningArgs] = None,
           website: Optional[BucketWebsiteArgs] = None)
@overload
def Bucket(resource_name: str,
           args: Optional[BucketArgs] = None,
           opts: Optional[ResourceOptions] = None)

这是我的代码

"""A Google Cloud Python Pulumi program"""
import pulumi
from pulumi_google_native.storage import v1 as storage

action1=storage.BucketLifecycleRuleItemActionArgs(storage_class='coldline', type='SetStorageClass')
condition1=storage.BucketLifecycleRuleItemConditionArgs(age=30, matches_storage_class='nearline')
myrule=storage.BucketLifecycleRuleItemArgs(action=action1, condition=condition1)
mycustomlifecycle=storage.outputs.BucketLifecycleResponse(rule=myrule)

bucket2 = storage.Bucket(resource_name='my-bucket', location='US-EAST1', location_type='region', storage_class='standard', lifecycle=mycustomlifecycle)

# Export the bucket self-link
pulumi.export('bucketSelfLink', bucket.self_link)

而且,当我执行以下命令以查看它将如何工作时

pulumi preview

    raise AssertionError((f"Unexpected type; expected a value of type `{typ}`"
AssertionError: Unexpected type; expected a value of type `typing.Sequence[pulumi_google_native.storage.v1.output.BucketLifecycleRuleItemResponse]` but got a value of type `<class `dict`>` at resource `my-bucket2`, property `lifecycle.rule`: {`action`: {`storageClass`: `Coldline`, `type`: `SetStorageClass`}, `condition`: {`age`: `30.0`, `matchesStorageClass`: `nearline`}} 

我很确定我没有正确传递生命周期规则的预期属性,问题是,我不知道如何传递它(因为我对 Python 不太了解)。我一直在尝试以不同的方式传递这些值(而不是字符串,只是将所有内容放在一行中),但我无处可去。

我将不胜感激有关如何跟踪此错误的任何指导。

解决方案: 好的,显然我所要做的就是在stackoverflow中要求修复它。我设法破解它。这就是我改变的

mycustomlifecycle=storage.outputs.BucketLifecycleResponse(rule=[myrule])

如果我没记错的话,发生的事情是我将字符串或字典值传递给期望序列的属性。添加 [] 变成了一个序列,因此代码现在可以工作了。

无论哪种方式,如果有人愿意解释为什么,将不胜感激。

标签: pythongoogle-cloud-platformpulumi

解决方案


很高兴看到你设法解决了这个问题。我会回答你的问题,为什么。

每个 Pulumi 资源都有一堆属性。这些属性需要分配给它们的特定类型。这可以通过减少反馈循环帮助您编写更有效的基础架构代码。您的 IDE(如果您正在使用)会告诉您已将属性传递给资源并验证它是否满足要求。

在此特定示例中,您正在构建 BucketLifeCycleResponse,上游 Google Cloud API 允许您在创建存储桶时指定多个其中之一。您可以在 Pulumi API 文档中看到这一点:

BucketLifecycleResponse规则:此属性是必需的。BucketLifecycleRuleItemResponse[]

记下[]最后的 - 这告诉您可以多次指定此属性。

在您最初的尝试中,您没有指定集合,因此您的 pulumi 程序不符合要求。添加后,[]您就满足了 API 要求,现在它可以工作了!


推荐阅读