Question

Je suis la création d'une instance par le biais de la formation de nuages de script.

La seule façon que j'ai trouvée pour attacher une partition de système d'exploitation a été par le biais de "BlockDeviceMappings de la propriété".(J'ai essayé d'utiliser "Volumes" bien avant, mais l'instance n'a pas pu être monté, le système m'a dit que /dev/sda avait déjà été cartographiée et roulé la création de l'instance)

Voici la partie pertinente de mon modèle:

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

Ma question est, comment puis-je balise le volume Ebs, que je crée ici avec "BlockDeviceMappings" propriété?Je n'ai pas trouver la solution la plus évidente.

Merci.

Était-ce utile?

La solution

A été en mesure de le faire fonctionner par le biais d'un AWS interface CLI, IAM rôle, et UserData de l'initialisation.

Ajoutée à 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\"",
  ""
]]}}

Également ajouter une référence à un rôle IAM qui peuvent décrire les volumes et créer des tags.

Ajouté ceci à la section "Ressources":

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

Référencé ce profil dans le Instance ressources:

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

Et dans IAM L'INTERFACE utilisateur de créer un nouveau Rôle appelé ec2-tag-instance, et céder la présente politique:

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

Cela dit, il serait beaucoup plus agréable si BlockDeviceMappings:Ebs avait soutenu Tags de l'élément.

Autres conseils

Merci Alex,

J'ai trouvé une marque de devis double disparue après EC2-Create-Tags :)

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

En outre, si les instances ne résident pas dans la région par défaut US-EST-1, veuillez également spécifier " Région de région " dans les "forts> EC2-Create-Tags et Volumes EC2-Creck-Volumes .

Si votre CloudFormation pile est balisé et vous voulez que votre EC2 volumes attachés de copier les balises de la pile, vous pouvez utiliser le dessous UserData de la valeur.

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. Écrire tous les stdout et stderr dans un fichier pour le débogage:

    `exec > /tmp/partie-001.log 2>&1

  2. (nécessite l'autorisation) Obtenir les balises de la pile:

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

  3. Obtenez de l'instance EC2 id à partir du point de terminaison de métadonnées:

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

  4. (nécessite l'autorisation) Obtenir l'EBS 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" " ")

  5. (nécessite l'autorisation) d'Ajouter des balises à l'EBS:aws ec2 create-tags --resources $EBS_IDS --tags "$TAGS" --region ${AWS::Region}

  6. Les étiquettes de Format pour l'ECS de marquage:

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

  7. (nécessite l'autorisation) de la Balise de l'ECS cluster:

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

La politique devrait ressembler à ceci:

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

Vous pouvez utiliser un modèle de cloudformation pour créer des ressources telles que la règle d'événement Cloudwatch et Lambda.L'invocation Lambda peut être déclenchée non seulement lorsqu'il existe un événement de création d'instance, mais lorsque des mises à jour se produisent dans des balises d'instance.

C'est ce que j'ai fait dans mon UserData EC2.Je pense que c'est beaucoup plus simple que la réponse ci-dessus.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top