Установите тег на AWS :: EC2 :: Instances BlockStorage корневого тома через CloudFormation - PullRequest
0 голосов
/ 11 апреля 2019

Мы хотим пометить каждый ресурс стека облачной информации определенным тегом (для выставления счетов и по финансовым причинам). Это включает в себя основное хранилище, используемое в главном разделе, смонтированном в (/dev/sda1).

Вот что у нас есть:

---
AWSTemplateFormatVersion: '2010-09-09'
Description: The Name
Parameters:
  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t3.small
    AllowedValues:
    - t3.nano
    - ...
  InstanceName:
    Description: Name Tag
    Type: String
Resources:
  TheECCInstance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: jenkins
      ImageId: !FindInMap [RegionMap, !Ref 'AWS::Region', AMI]
      InstanceType:
        Ref: InstanceType
      SubnetId: subnet-0e9c7d7c2711aaf9e
      BlockDeviceMappings:
        - DeviceName: "/dev/sda1"
          Ebs:
            VolumeSize:
              Ref: EBSBlockSize
            VolumeType: gp2
      Tags:
      - Key: Name
        Value:
          Ref: InstanceName
      - Key: Type
        Value: TheType

Mappings:
  RegionMap:
    'ap-northeast-3':
      NAME: ap-northeast-3b
      AMI: 'ami-05e896b95030bd37c'
    'sa-east-1':
      NAME: sa-east-1b
      AMI: 'ami-03c6239555bb12112'
    'eu-west-1':
      NAME: eu-west-1b
      AMI: 'ami-00035f41c82244dab'
    ...

Outputs:
  ...

Я не против использовать что-то подобное :

  RootVolume:
    Type: AWS::EC2::Volume      // Or Something in that direction (EFS / EBS / whatever)
    Properties:
      Size:
        Ref: EBSBlockSize
      VolumeType: gp2
      AvailabilityZone: !FindInMap [RegionMap, !Ref 'AWS::Region', NAME]
      Tags:
        - Key: Type
          Value: TheType

и его монтаж . Просто кажется невозможным привязать его как основной раздел. Либо как AWS :: EC2 :: Volume, AWS :: EFS и т. Д. Любая помощь здесь будет оценена. В настоящее время мы создаем экземпляр, а затем тег после создания стека. Но это кажется несколько хрупким, и должен быть более легкий способ сделать это ...

1 Ответ

1 голос
/ 12 апреля 2019

Невозможно с образованием облаков

Оказывается, это невозможно с облачной информацией aws.Этот вопрос подсказал мне ответ: https://serverfault.com/questions/876942/create-new-ec2-instance-with-existing-ebs-volume-as-root-device-using-cloudforma

Решение с помощью terraform

Это довольно просто с помощью "terraform":


resource "aws_instance" "someName" {
  ami           = "ami-***********"
  instance_type = "t2.*******"
  tags          = {
    Type = "InstanceTag"
  }
  volume_tags   = {
    Type = "VolumeTag"
  }
}

Наше решение (Jenkins и shellscript)

Мы используем облачную информацию, чтобы порождать наши инстансы CI через Дженкинса.Переход на terraform привел бы к большему количеству работы, чем мы были готовы принять.Нам нужны теги для расчета стоимости.Поэтому, когда мы понимали, что облачность не подходит, мы использовали cli, чтобы пометить экземпляры после их создания.

Очевидно, что awscli должен быть установлен.Учетные данные поступают через переменные среды.

Вот скрипт, который мы использовали:

sleep 1m
EC2_VOLUMES=$(aws ec2 describe-instances --region "${INSTANCE_REGION}" --filter "Name=tag-key,Values=Type" "Name=tag-value,Values=Jenkins" --filter "Name=tag-key,Values=Name" "Name=tag-value,Values=BackendJenkins${BUILD_NUMBER}" --query "Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.[VolumeId]" --output text)

echo $AWS_SECRET_ACCESS_KEY | base64 -i > foo.txt

while read -r RESOURCE; do
    # We set the name and the type tag
    aws ec2 create-tags --resources "$RESOURCE" --region "${INSTANCE_REGION}" --tags "Key=Type,Value=TheTagValue"
    aws ec2 create-tags --resources "$RESOURCE" --region "${INSTANCE_REGION}" --tags "Key=Name,Value=TheInstanceName${BUILD_NUMBER}"
done <<< "$EC2_VOLUMES"

Спасибо за все подсказки о порождении EC2 :: Volumes и Tag Propagation.

...