在 AWS CloudFormation 中使用 EC2 实例创建的卷上的标签

Tags on volumes created with EC2 instances in AWS CloudFormation

我正在创建带有标签的 A​​WS CloudFormation 堆栈。

当我这样做时,堆栈创建的所有 EC2 实例也会获得标签(这正是我想要的)。但是附加到那些 EC2 实例的所有卷都没有获得标签。

我能以某种方式改变它吗?我想要所有支持它们的资源上的标签。

标签是非传递性应用的;您必须明确地将标签与每个资源相关联。引用自 AWS docsAWS::EC2::Instance 资源类型,标签为:

An arbitrary set of tags (key–value pairs) for this instance.

如果您真的想使用 AWS CloudFormation 将标签关联到卷,另一种方法是使用 AWS::EC2::Volume 和使用 AWS::EC2::VolumeAttachment 将它们附加到 EC2 实例。另一种替代方法是使用 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

        }

    }
}