Es allí una manera a la etiqueta de un volumen de la raíz cuando la inicialización de la plantilla de cloudformation?

StackOverflow https://stackoverflow.com//questions/24026425

Pregunta

Estoy creando una instancia a través de la formación de nubes de secuencia de comandos.

La única manera que he encontrado para adjuntar una partición de sistema operativo fue a través de "BlockDeviceMappings" de la propiedad.(He intentado usar el "Volumen" de la propiedad antes, pero la instancia no podía ser montado, el sistema me dijo que /dev/sda ya se ha asignado y se revierte la creación de instancia)

Aquí es la parte relevante de mi plantilla:

  "Resources" :
  {
    "Ec2Instance" :
    {
      "Type" : "AWS::EC2::Instance",
      "Properties" :
      {
        "BlockDeviceMappings" :
        [{
          "DeviceName" : "/dev/sda",
          "Ebs" :
          {
            "VolumeSize" : { "Ref" : "RootVolumeSize" },
            "SnapshotId" :
            { "Fn::FindInMap" : [ "RegionMap",
              { "Ref" : "AWS::Region" }, "RootVolumeSnapshotId" ]
            }
          }
        }],
        ...
       }
     }

Mi pregunta es, ¿cómo puedo etiquetar el volumen de Ebs, que estoy creando aquí con "BlockDeviceMappings" propiedad?No he podido encontrar la solución obvia.

Gracias.

¿Fue útil?

Solución

Era capaz de hacer que funcione a través de una interfaz CLI de AWS, la función de IAM, y UserData de inicialización.

Añadido esto a AWS::EC2::Instance:Properties:UserData

{ "Fn::Base64" : { "Fn::Join" : [ "\n", [
  "#!/bin/bash",
  "set -eux",
  "exec > >(tee /tmp/user-data.log | logger -t user-data -s 2>/dev/console) 2>&1",
  { "Fn::Join" : [ "", [
    "AWS_STACK_NAME='", { "Ref" : "AWS::StackName" }, "'"
  ]]},
  { "Fn::Join" : [ "", [
    "AWS_ROOT_VOLUME_SNAPSHOT_ID='",
      { "Fn::FindInMap" :
         [ "RegionMap", { "Ref" : "AWS::Region" }, "RootVolumeSnapshotId" ]},
      "'"
  ]]},
  "AWS_INSTANCE_ID=$( curl http://169.254.169.254/latest/meta-data/instance-id )",
  "",
  "AWS_HOME=/opt/aws",
  "AWS_BIN_DIR=\"${AWS_HOME}/bin\"",
  "export EC2_HOME=\"${AWS_HOME}/apitools/ec2\"",
  "export JAVA_HOME=/etc/alternatives/jre_1.7.0",
  "",
  "ROOT_DISK_ID=$(",
  "    \"${AWS_BIN_DIR}/ec2-describe-volumes\" \\",
  "        --filter \"attachment.instance-id=${AWS_INSTANCE_ID}\" \\",
  "        --show-empty-fields \\",
  "      | grep '^VOLUME' \\",
  "      | awk '{printf \"%s,%s\\n\", $4, $2}' \\",
  "      | grep '^${AWS_ROOT_VOLUME_SNAPSHOT_ID}' \\",
  "      | cut --delimiter=, --fields=2",
  "    exit ${PIPESTATUS[0]}",
  "  )",
  "\"${AWS_BIN_DIR}/ec2-create-tags \\",
  "  \"${ROOT_DISK_ID}\" \\",
  "  --tag \"Name=${AWS_STACK_NAME}-root\"",
  ""
]]}}

También tenemos que añadir una referencia a una función de IAM que pueden describir los volúmenes y crear etiquetas.

Agrega esto a la sección de "Recursos":

"InstanceProfile" :
{
  "Type" : "AWS::IAM::InstanceProfile",
  "Properties" :
  {
    "Path" : "/",
    "Roles" : [ "ec2-tag-instance" ]
  }
}

Se hace referencia a este perfil en el Instance recursos:

"Ec2Instance" :
{
  "Type" : "AWS::EC2::Instance",
  "Properties" :
  {
    ...
    "IamInstanceProfile" : {"Ref" : "InstanceProfile"},
    ...
  }
}

Y en IAM Interfaz de usuario crear una nueva Función llamada ec2-tag-instance, y asignar esta política:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*",
        "ec2:CreateTags"
      ],
      "Resource": "*"
    }
  ]
}

Dicho esto, sería mucho más agradable si BlockDeviceMappings:Ebs había apoyado Tags elemento.

Otros consejos

Gracias Alex,

Descubrí que faltan una comilla doble que falta después de ec2-create-tags :)

  "\"${AWS_BIN_DIR}/ec2-create-tags\" \\",
  "  \"${ROOT_DISK_ID}\" \\",
  "  --tag \"Name=${AWS_STACK_NAME}-root\"",

Además, si las instancias no están residiendo en la región predeterminada de US-EAST-1, también especifique " - región región " en las etiquetas ec2-create y EC2-Describa-volúmenes Comandos.

Si su pila de formación de nubes está etiquetada y desea que sus volúmenes conectados EC2 copian a través de las etiquetas de la pila, puede usar el valor de UserData a continuación.

Fn::Base64: !Sub |
    #!/bin/bash -xe
    exec > /tmp/part-001.log 2>&1
    # --==Tagging Attached Volumes==--
    TAGS=$(aws cloudformation describe-stacks --stack-name ${AWS::StackName} --query 'Stacks[0].Tags' --region ${AWS::Region})
    EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
    EBS_IDS=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values="$EC2_INSTANCE_ID" --region ${AWS::Region} --query 'Volumes[*].[VolumeId]' --out text | tr "\n" " ")
    aws ec2 create-tags --resources $EBS_IDS --tags "$TAGS" --region ${AWS::Region}
    TAGS=$(echo $TAGS | tr "Key" "key" | tr "Value" "value")
    aws ecs tag-resource --resource-arn arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${EcsClusterName} --tags "$TAGS"

  1. Escriba todos los stdout y stderr para solicitar la depuración:

    `ejecut> /tmp/part-001.log 2> & 1

  2. (requiere permiso) Obtenga las etiquetas de la pila:

    TAGS=$(aws cloudformation describe-stacks --stack-name ${AWS::StackName} --query 'Stacks[0].Tags' --region ${AWS::Region})

  3. Obtenga la ID de instancia de EC2 del punto final de metadatos:

    EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

  4. (requiere permiso) Obtenga las IDS EBS:

    EBS_IDS=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values="$EC2_INSTANCE_ID" --region ${AWS::Region} --query 'Volumes[*].[VolumeId]' --out text | tr "\n" " ")

  5. (requiere permiso) Agregue etiquetas a los volúmenes EBS: aws ec2 create-tags --resources $EBS_IDS --tags "$TAGS" --region ${AWS::Region}

  6. Etiquetas de formato para ECS TAGGING:

    TAGS=$(echo $TAGS | tr "Key" "key" | tr "Value" "value")

  7. (requiere permiso) etiqueta el clúster de ECS:

    aws ecs tag-resource --resource-arn arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${EcsClusterName} --tags "$TAGS"

  8. La política debe parecer esto:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "ec2:DeleteTags",
                    "ec2:CreateTags",
                    "ecs:TagResource", 
                    "cloudformation:DescribeStacks"
                ],
                "Resource": "*"
            }
        ]
    }
    

Puede usar la plantilla de CloudFormation para crear recursos como la regla de evento Cloudwatch y Lambda.La invocación Lambda puede ser activada no solo cuando existe un evento de creación de instancias, sino que cuando las actualizaciones pasan a las etiquetas de instancia.

Esto es lo que hice en mi UserData de EC2.Creo que es mucho más sencillo que la respuesta anterior.

Key=<Your Tag Name>
Value=<Your Tag Value>
Region=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep -oP "(?<=\"region\" : \")[^\"]+")

aws ec2 create-tags --resources $(aws ec2 describe-instances --instance-ids $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --region $Region | grep -oP "(?<=\"VolumeId\": \")[^\"]+") --tags Key=$Key,Value=$Value --region $Region

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top