-TagSpecification
使用 AWSPowerShell 部署 EC2 实例时,我发现自己无法使用参数在实例创建时应用标签New-EC2Instance
。我正在动态生成标签,到目前为止我能想到的最好的方法仍然要求我部署没有标签的实例,并且然后申请New-EC2Tag
到捕获的InstanceID
s。我的构造目前感觉很笨重,我无法摆脱这样的怀疑:等待部署后标记只是将糟糕的对象构造推迟到具有更好的错误处理功能的函数;即使是 示例 AWS 指南。
我如何清理我的实现并允许部署时标记?
样本
给定如下的标签规范构造...
$tags = @'
{
"foo":"bar"
,"bing":"bong"
}
'@ | ConvertFrom-Json
$TagSpecification = @()
$tags.PSObject.Properties | ForEach-Object {
$tag = New-Object -TypeName Amazon.EC2.Model.Tag -ArgumentList @('Key', 'Value')
$tag.Key = $_.Name
$tag.Value = $_.Value
$TagSpecification += $tag
Remove-Variable tag
}
...尝试以这种方式在部署时应用标签...
$newHost = New-EC2Instance ... -TagSpecification $TagSpecification ...
...导致错误:
New-EC2Instance : Cannot bind parameter 'TagSpecification'. Cannot convert the "Amazon.EC2.Model.Tag" value of type "Amazon.EC2.Model.Tag" to type "Amazon.EC2.Model.TagSpecification".
但是,如果我-TagSpecification
在New-EC2Instance
调用时省略参数,我可以使用$TagSpecification
随后在调用中构造的对象:
New-EC2Tag -ResourceId $newHost.Instances.InstanceId -Tags $TagSpecification
显然,New-EC2Tag
对于近似对象构造有更好的处理,但我必须假设有一种方法可以在一次调用而不是两次调用中应用我的标签。
我究竟做错了什么?
答案1
这似乎是解决这个问题的最佳方法:
$TagSpecification = [Amazon.EC2.Model.TagSpecification]::new()
$TagSpecification.ResourceType = 'Instance'
$tags.PSObject.Properties | ForEach-Object {
$tag = [Amazon.EC2.Model.Tag]@{
Key = $_.Name
Value = $_.Value
}
$TagSpecification.Tags.Add($tag)
}
基本上,您创建TagSpecification
对象,然后您需要添加ResourceType
您的目标(请参阅下面该类型的文档页面的链接以获取有效 ResourceType 值的完整列表)。
您可以使用 hashtable cast 方法创建这样的标签,因为它具有默认(无参数)构造函数,并且具有可公开设置的属性。您也可以先使用::new()
与创建 TagSpecification 对象类似的方法创建它,然后手动填写 Key 和 Value,再将其添加到标签列表中。
在创建标签时,这也是一个选项:
$tag = [Amazon.EC2.Model.Tag]::new($_.Name, $_.Value)
然后,将标签添加到 TagSpecification 对象.Tags
属性中引用的通用列表中。
我从这里的文档页面中提取了以下内容来解决这个问题: https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/EC2/TTag.html https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/EC2/TTagSpecification.html