Назад | Перейти на главную страницу

круговая зависимость образования облаков с помощью elasticsearch

Я пытаюсь создать шаблон облачной информации, который будет иметь, среди прочего, экземпляр ec2 с EIP и доменом elasticsearch. Проблема в том, что я создаю циклическую зависимость, которую я не могу понять, как разъединить. Вот.

Экземпляру ec2 нужен адрес домена elasticsearch, поэтому я добавляю его в файл в UserData.

Политикам доступа elasticsearch требуется общедоступный IP-адрес экземпляра EC2, чтобы разрешить доступ с этого сервера.

Итак, вот оно. Elasticsearch зависит от EIP экземпляра ec2, а экземпляр ec2 зависит от адреса домена elasticsearch. Итак, я пытаюсь использовать EIPAssociation, чтобы отложить необходимость создания EC2Instance до тех пор, пока не будет создан домен ElasticSearch. Но все равно не повезло.

У кого-нибудь есть хорошее решение этого вопроса? Я знаю, что могу иметь AccessPolicy, основанный на IAM, но я бы предпочел использовать IP.

Заранее спасибо.

Вот код:

"MyEIP" : {
  "Type" : "AWS::EC2::EIP"
},
"ElasticsearchDomain": {
  "Type": "AWS::Elasticsearch::Domain",
  "Properties": {
    "ElasticsearchClusterConfig": {
      "DedicatedMasterEnabled": "false",
      "InstanceCount": "1",
      "ZoneAwarenessEnabled": "false",
      "InstanceType": "t2.micro.elasticsearch"
    },
    "EBSOptions": {
      "EBSEnabled": true,
      "Iops": 0,
      "VolumeSize": 10,
      "VolumeType": "gp2"
    },
    "SnapshotOptions": {
      "AutomatedSnapshotStartHour": "0"
    },
    "AccessPolicies":{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": "es:*",
          "Resource": { "Fn::Join" : [ "", [
            "arn:aws:es:us-east-1:00000000000:domain/",
            { "Ref" : "ElasticsearchDomain" },
            "/*"
          ]]},
          "Condition": {
            "IpAddress": {
              "aws:SourceIp": { "Ref" : "MyEIP" }
            }
          }
        }
      ]
    },
    "AdvancedOptions": {
      "rest.action.multi.allow_explicit_index": "true"
    }
  }
},
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance",
  "Properties" : {
    "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "64"]},
    "KeyName" : { "Ref" : "KeyName" },
    "InstanceType" : { "Ref": "ServerInstanceType" },
    "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
    "Tags": [{
      "Key" : "Name",
      "Value" : {
        "Fn::Join" : [ "", [
          { "Ref" : "AWS::StackName" }
        ]]
      }
    }],
      "UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", [
      "#!/bin/bash -ex\n",
      "echo \"",
      "STACK_NAME=", { "Ref" : "AWS::StackName"}, "\n",
      "ELASTICSEARCH_CLIENT=https://", { "Fn::GetAtt": [ "ElasticsearchDomain", "DomainEndpoint" ] }, "/\n",
  "\n",
      "\" > /etc/uni_creds\n"
    ]]}}
  }
},
"EIPAssociation" : {
   "Type": "AWS::EC2::EIPAssociation",
   "Properties": {
      "EIP": { "Ref" : "MyEIP" },
      "InstanceId": { "Ref" : "Ec2Instance" }
   }
}

Думаю, я решил свою проблему. Хотя я получал сообщение об ошибке, в котором говорилось, что существует циклическая зависимость между экземпляром EC2, доменом elasticsearch и EIP или EIPAssociation, фактическая ошибка заключалась в том, что я ссылался на свой домен elasticsearch в моем домене elasticsearch.

"ElasticsearchDomain": {
  "Type": "AWS::Elasticsearch::Domain"
  ...
  { "Ref" : "ElasticsearchDomain" },
}

Что, очевидно, вызовет проблему. Это сообщение об ошибке заставило меня забежать не на то дерево. В любом случае, тупая ошибка. Надеюсь, никто больше не столкнется с этим.