【发布时间】:2022-03-23 01:04:47
【问题描述】:
我正在使用标签创建我的 AWS CloudFormation 堆栈。
当我这样做时,堆栈创建的所有 EC2 实例也会获得标签(这是我想要的)。但是附加到这些 EC2 实例的所有卷都没有获得标签。
我能以某种方式改变它吗?我想要所有支持它们的资源上的标签。
【问题讨论】:
标签: amazon-web-services amazon-ec2 amazon-cloudformation
我正在使用标签创建我的 AWS CloudFormation 堆栈。
当我这样做时,堆栈创建的所有 EC2 实例也会获得标签(这是我想要的)。但是附加到这些 EC2 实例的所有卷都没有获得标签。
我能以某种方式改变它吗?我想要所有支持它们的资源上的标签。
【问题讨论】:
标签: amazon-web-services amazon-ec2 amazon-cloudformation
标签以非传递方式应用;您必须明确地将标签与每个资源相关联。引用AWS docs 的AWS::EC2::Instance 资源类型,标签为:
此实例的任意一组标签(键值对)。
如果您真的想使用 AWS CloudFormation 将标签关联到卷,另一种方法是使用 AWS::EC2::Volume 创建卷(并为卷指定标签)并使用 @ 将它们附加到 EC2 实例987654325@。另一种方法是使用Lambda-backed custom resources 来完成此操作。
【讨论】:
我对通过 Terraform 创建的实例(50-75 个实例)有同样的问题。我编写了这个 Powershell + AWS CLI 脚本来标记卷:
$instances = aws ec2 --profile=xxxxxx-us-east-2 describe-instances --query "Reservations[].Instances[].[InstanceId]" --output text
foreach ($instance in $instances)
{
Write-Host $instance
$filter = "Name=attachment.instance-id,Values=$instance"
$volumes = aws ec2 --profile=xxxxxx-us-east-2 describe-volumes --filters $filter --query "Volumes[].Attachments[].[VolumeId]" --output text
Write-Host $volumes
$raw= aws ec2 --profile=xxxxxx-us-east-2 describe-instances --instance-ids $instance --query "Reservations[*].Instances[*].[Tags]" --output json
$temp1 = $raw | ConvertFrom-Json
$temp2 = ConvertTo-Json -InputObject $temp1.GetValue(0).GetValue(0).GetValue(0)
$tags = $temp2 | ConvertFrom-Json
foreach ($volume in $volumes)
{
Write-Host $volume
foreach($tag in $tags)
{
Write-Host $tag.Key'='$tag.Value
$parm = "Key=" + $tag.Key + ",Value=" + $tag.Value
aws ec2 --profile=xxxxxx-us-east-2 create-tags --resources $volume --tags $parm
}
}
}
【讨论】: