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 的要求,现在可以使用了!
我是 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 的要求,现在可以使用了!