Gibt es eine Möglichkeit, ein Root-Volume bei der Initialisierung über die Cloudformation-Vorlage zu kennzeichnen?

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

Frage

Ich erstelle eine Instanz über das Cloud-Formation-Skript.

Die einzige Möglichkeit, eine Betriebssystempartition anzuhängen, war die Eigenschaft „BlockDeviceMappings“.(Ich habe bereits zuvor versucht, die Eigenschaft „Volumes“ zu verwenden, aber die Instanz konnte nicht gemountet werden. Das System teilte mir mit, dass /dev/sda bereits zugeordnet war, und setzte die Instanzerstellung zurück.)

Hier ist der relevante Teil meiner Vorlage:

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

Meine Frage ist: Wie kann ich das Ebs-Volume, das ich hier erstelle, mit der Eigenschaft „BlockDeviceMappings“ kennzeichnen?Ich habe die offensichtliche Lösung nicht gefunden.

Danke.

War es hilfreich?

Lösung

Konnte es über eine AWS CLI-Schnittstelle, eine IAM-Rolle und eine UserData-Initialisierung zum Laufen bringen.

Dies wurde hinzugefügt 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\"",
  ""
]]}}

Außerdem muss ein Verweis auf eine IAM-Rolle hinzugefügt werden, die Volumes beschreiben und Tags erstellen kann.

Dies wurde zum Abschnitt „Ressourcen“ hinzugefügt:

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

Auf dieses Profil verwiesen im Instance Ressource:

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

Und in IAM UI erstellt eine neue Rolle mit dem Namen ec2-tag-instance, und weisen Sie diese Richtlinie zu:

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

Das heißt, es wäre viel schöner, wenn BlockDeviceMappings:Ebs unterstützt hatte Tags Element.

Andere Tipps

danke alex,

Ich fand heraus, dass es eine doppelte Anführungszeichen gibt, die nach EC2-Create-Tags fehlt :)

generasacodicetagpre.

Außerdem, wenn die Instanzen nicht in der standardmäßigen US-Ost-1-Region wohnhaft sind, geben Sie auch in den ec2-creme-tags - Region an> und EC2-beschreibenden Volumes Befehle.

Wenn Ihr CloudForation-Stack markiert ist und Sie möchten, dass Ihre EC2-Beilagen, um die Tags aus dem Stapel zu kopieren, können Sie den untenstehenden UserData-Wert verwenden.

generasacodicetagpre.

    .
  1. Schreiben Sie alle stdout und stderr in die Datei zum Debugging:

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

  2. (erfordert Erlaubnis) Holen Sie sich die Tags aus dem Stapel:

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

  3. Holen Sie sich die EC2-Instanz-ID aus dem Metadatenendpunkt:

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

  4. (erfordert Erlaubnis) Holen Sie sich die EBS-IDs:

    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. (erfordert Erlaubnis) Fügen Sie den EBS-Volumes Tags hinzu: aws ec2 create-tags --resources $EBS_IDS --tags "$TAGS" --region ${AWS::Region}

  6. Format-Tags für ECS-Tagging:

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

  7. (erfordert Erlaubnis) Markieren Sie den ECS-Cluster:

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

  8. Die Richtlinie sollte so aussehen:

    generasacodicetagpre.

Sie können die CloudFormation-Vorlage verwenden, um Ressourcen wie Cloudwatch-Ereignisregel und Lambda zu erstellen.Der Lambda-Aufruf kann nicht nur ausgelöst werden, wenn ein Instanz-Erstellungs-Ereignis vorliegt, sondern wenn Updates mit Instanz-Tags passieren.

Das habe ich in meiner EC2-UserData getan.Ich denke, es ist viel einfacher als die Antwort.

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top