Есть ли способ пометить корневой том при инициализации из шаблона облачной информации?

Я создаю экземпляр через скрипт формирования облака.

Единственный способ, которым я нашел раздел ОС, был через свойство «BlockDeviceMappings». (Раньше я пытался использовать свойство "Volumes", но экземпляр не удалось смонтировать, система сообщила мне, что / dev / sda уже сопоставлен, и откатил создание экземпляра)

Вот соответствующая часть моего шаблона:

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

У меня вопрос, как я могу пометить создаваемый мной том Ebs с помощью свойства «BlockDeviceMappings»? Я не нашел очевидного решения.

Спасибо.


person Alexander Pogrebnyak    schedule 03.06.2014    source источник
comment
Обратите внимание, что с марта 2017 г. вы можете пометить тома во время создания из aws в веб-консоли AWS. amazon.com/marketplace/pp?sku=9m7m53y9ci90nd0ocjs2svfen (но еще не CloudFormation)   -  person Jason    schedule 21.04.2017


Ответы (4)


Смог заставить его работать через интерфейс командной строки AWS, роль IAM и инициализацию UserData.

Добавлено в 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\"",
  ""
]]}}

Также необходимо добавить ссылку на роль IAM, которая может описывать тома и создавать теги.

В раздел «Ресурсы» добавлено:

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

Ссылка на этот профиль на ресурсе Instance:

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

И в IAM UI создайте новую роль с именем ec2-tag-instance и назначьте эту политику:

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

При этом было бы намного лучше, если бы BlockDeviceMappings:Ebs поддерживал элемент Tags.

person Alexander Pogrebnyak    schedule 09.06.2014
comment
FWIW, я создал запрос функции для добавления поддержки тегов BlockDeviceMappings: Ebs, это может помочь вам сделать то же самое. - person BillMan; 17.09.2014
comment
@BillMan. Можете ли вы вставить ссылку с запросом функции? Я буду поддерживать его. - person Alexander Pogrebnyak; 17.09.2014
comment
@BillMan У вас есть ссылка с запросом функции для нас? Я с нетерпением жду этой возможности, потому что она намного проще, чем это решение, описанное выше, с частью UserData. - person Henry31; 02.05.2018
comment
Предлагаемая политика IAM может быть чрезмерно разрешительной для некоторых случаев использования, поскольку она позволяет создавать или перезаписывать любые теги ресурсов EC2. Если ваш экземпляр скомпрометирован, это может создать хаос, если вы будете использовать теги для других целей (например, для управления снимками состояния EC2 EBS). - person Richard Green; 07.09.2019

Если ваш стек CloudFormation помечен тегами и вы хотите, чтобы ваши присоединенные тома EC2 копировали теги из стека, вы можете использовать указанное ниже значение UserData.

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. Запишите весь стандартный вывод и стандартный поток данных в файл для отладки:

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

  2. (требуется разрешение) Получить теги из стека:

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

  3. Получите идентификатор экземпляра EC2 из конечной точки метаданных:

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

  4. (требуется разрешение) Получите 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. (требуется разрешение) Добавить теги к томам EBS: aws ec2 create-tags --resources $EBS_IDS --tags "$TAGS" --region ${AWS::Region}

  6. Теги формата для тегов ECS:

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

  7. (требуется разрешение) Пометьте кластер ECS:

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

Политика должна выглядеть так:

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

Вы можете использовать шаблон CloudFormation для создания ресурсов, таких как правило событий CloudWatch и Lambda. Вызов лямбда-выражения может запускаться не только при возникновении события создания экземпляра, но и при обновлении тегов экземпляра.

person Lina T    schedule 08.07.2019

Это то, что я сделал в своих пользовательских данных ec2. Я думаю, что это намного проще, чем ответ выше.

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
person Xing-Wei Lin    schedule 20.08.2015
comment
Вопрос был в том, как это сделать из шаблона CloudFormation. Если вы посмотрите на шаблон в моем ответе, вы увидите, что он делает именно это. - person Alexander Pogrebnyak; 20.08.2015