Amazon-Web-Services

如何在創建時標記 EC2 實例

  • December 20, 2018

使用 AWSPowerShell 部署 EC2 實例時,我發現自己無法-TagSpecification使用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對近似對象構造有更好的處理,但我必須假設有一種方法可以在一次呼叫而不是兩次呼叫中應用我的標籤。

我究竟做錯了什麼?

這似乎是最好的方法:

$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

引用自:https://serverfault.com/questions/946190