Я пытаюсь создать шаблон облачной информации, который будет иметь, среди прочего, экземпляр 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" },
}
Что, очевидно, вызовет проблему. Это сообщение об ошибке заставило меня забежать не на то дерево. В любом случае, тупая ошибка. Надеюсь, никто больше не столкнется с этим.