GCP - 使用 Pulumi Python 将生命周期规则分配给存储桶时出错

GCP - Error assigning lifecycle rule to bucket using 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)。 我一直在尝试以不同的方式传递这些值(而不是字符串,只是将所有内容放在一行中)但我一无所获。

对于如何解决此错误的任何指导,我将不胜感激。

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

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

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

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

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

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

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

BucketLifecycleResponse rule: This property is required.BucketLifecycleRuleItemResponse[]

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

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