首页 > 解决方案 > S3 生命周期配置与使用 PowerShell 的过滤器

问题描述

我需要配置 AWS S3 生命周期管理策略,在 60 天后将所有包含带有键“Virginia”且其值为“True”的对象标签的备份移动到 AWS Glacier。我有以下 PowerShell 脚本,我需要帮助的部分是如何使用对象标签及其值进行过滤。

$LifecycleTransition = New-object Amazon.S3.Model.LifecycleTransition
$LifecycleTransition.Days = 60
$LifecycleTransition.StorageClass = ‘Glacier’

$LifecycleRule = New-Object Amazon.S3.Model.LifecycleRule
$LifecycleRule.Id = “Glacier60Days”
$LifecycleRule.Transition = $LifecycleTransition
$LifecycleRule.Prefix = $null
$LifecycleRule.Filter =????

$LifecycleRule.Status = “Enabled”
Write-S3LifecycleConfiguration -BucketName mybucketname - 
Configuration_Rules $LifecycleRule

标签: amazon-web-servicespowershellamazon-s3

解决方案


我发现使用 PowerShell 很难做到这一点,仍在研究它 - 通过 .NET 类定义 Amazon.S3.Model.LifecycleFilterPredicate 似乎很棘手。同时,如果 awscli 是您可以使用的东西,这里是可以将带有配置的 json 文件作为输入的方法:

  1. 创建以下配置并将其保存到 json 文件中:

    { "Rules": [ { "Expiration": { "Days": 50 }, "ID": "remove-60-days", "Filter": { "And": { "Prefix": "py", "标签”:[{“Key”:“未使用”,“Value”:“是”},{“Key”:“raj”,“Value”:“false”}]}},“状态”:“已启用" }, { "过期”:{“天”:26 },“ID”:“20 天内不做任何事情”,“过滤器”:{“和”:{“前缀”:“java”,“标签”:[ {“键”:“jadoo”,“值”:“nagri”}]}},“状态”:“启用”,“转换”:[{“天”:20,“存储类”:“冰川”}] } ] }26 },“ID”:“do-nothing-in-20-days”,“过滤器”:{“And”:{“Prefix”:“java”,“Tags”:[{“Key”:“jadoo” ,“值”:“nagri”}] }},“状态”:“启用”,“转换”:[{“天”:20,“存储类”:“冰川”}] }] }26 },“ID”:“do-nothing-in-20-days”,“过滤器”:{“And”:{“Prefix”:“java”,“Tags”:[{“Key”:“jadoo” ,“值”:“nagri”}] }},“状态”:“启用”,“转换”:[{“天”:20,“存储类”:“冰川”}] }] }{“和”:{“前缀”:“java”,“标签”:[{“键”:“jadoo”,“值”:“nagri”}]}},“状态”:“启用”,“转换": [ { "Days": 20, "StorageClass": "GLACIER" } } } ] }{“和”:{“前缀”:“java”,“标签”:[{“键”:“jadoo”,“值”:“nagri”}]}},“状态”:“启用”,“转换": [ { "Days": 20, "StorageClass": "GLACIER" } } } ] }jadoo", "Value": "nagri" } ] } }, "Status": "Enabled", "Transitions": [ { "Days": 20, "StorageClass": "GLACIER" } } ] }jadoo", "Value": "nagri" } ] } }, "Status": "Enabled", "Transitions": [ { "Days": 20, "StorageClass": "GLACIER" } } ] }

这里有 2 条规则。其中一个是简单地删除,另一个是发送到冰川 - 规则都使用标签以及前缀来满足您的示例需求

  1. 现在,使用下面的 CLI 和输入 json 文件:

    aws s3api put-bucket-lifecycle-configuration --bucket test-bla --lifecycle-configuration file://config.json

这应该将给定的配置分配给存储桶“test-bla”我希望这会有所帮助。

参考put-bucket-lifecycle 配置

-- [编辑] -- 好的 - 这是 PowerShell:

#Create the rule filter object
$NewRule=[Amazon.S3.Model.LifecycleRule]::new()
$NewRule.Id = "Test-From-Write-cmdlet-1"

#Create rule expiration
$NewRuleExpiration = [Amazon.S3.Model.LifecycleRuleExpiration]::new()
$NewRuleExpiration.Days = 50
$NewRule.Expiration = $NewRuleExpiration

$NewRule.Status = [Amazon.S3.LifecycleRuleStatus]::Enabled

#create filter with prefix 'and' tags
$AndOperand=[Amazon.S3.Model.LifecycleAndOperator]::new()
$operands = [System.Collections.Generic.List[Amazon.S3.Model.LifecycleFilterPredicate]]::new()

#create filters to add to AndOperand
$PrefixFilter = [Amazon.S3.Model.LifecyclePrefixPredicate]@{"Prefix"=  "py"}

$TagFilter = [Amazon.S3.Model.LifecycleTagPredicate]@{"Tag" = @{"Key" = "non-use";"Value"="yes"}}

#You can add more filters into operands 
$operands = @($PrefixFilter, $TagFilter)

#create new filter
$NewLifecycleFilter = [Amazon.S3.Model.LifecycleFilter]::new()
$NewRule.Filter = $NewLifecycleFilter
$NewLifecycleFilter.LifecycleFilterPredicate = $AndOperand
$NewRule.Filter.LifecycleFilterPredicate.Operands = $operands

Write-S3LifecycleConfiguration -BucketName test-bla -Configuration_Rule $NewRule

推荐阅读