python - 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])
如果我没记错的话,发生的事情是我将字符串或字典值传递给期望序列的属性。添加 [] 变成了一个序列,因此代码现在可以工作了。
无论哪种方式,如果有人愿意解释为什么,将不胜感激。
解决方案
很高兴看到你设法解决了这个问题。我会回答你的问题,为什么。
每个 Pulumi 资源都有一堆属性。这些属性需要分配给它们的特定类型。这可以通过减少反馈循环帮助您编写更有效的基础架构代码。您的 IDE(如果您正在使用)会告诉您已将属性传递给资源并验证它是否满足要求。
在此特定示例中,您正在构建 BucketLifeCycleResponse,上游 Google Cloud API 允许您在创建存储桶时指定多个其中之一。您可以在 Pulumi API 文档中看到这一点:
BucketLifecycleResponse规则:此属性是必需的。BucketLifecycleRuleItemResponse[]
记下[]
最后的 - 这告诉您可以多次指定此属性。
在您最初的尝试中,您没有指定集合,因此您的 pulumi 程序不符合要求。添加后,[]
您就满足了 API 要求,现在它可以工作了!
推荐阅读
- javascript - 为什么我收到此错误 - 无法在“节点”上执行“appendChild”:新的子元素包含父元素
- sql - 在 SQL Server 中获取上一年的记录
- arrays - 使用 `form_with` 返回一个数组?
- python - 如何将定义函数的输出转换为列表?
- mysql - 将 .frm 和 ibdata 文件添加到 /var/lib/mysql 后 MariaDB 没有启动?
- jmeter - jmeter - 如何将线程组名称/样本名称提取到另一个样本中
- python - Python - 如何将每个股票代码包含在新列中
- python - 尝试解决 Python 1-D 偏微分方程求解器中的问题
- python - 具有相同字符串的两个不同打印结果
- ios - 打开 Package.swift 或 generate-xcodeproj