Динамически получать конечную точку Elasticache в рецепте шеф-повара?
Я создал шаблон CloudFormation для запуска своего веб-приложения, которое содержит Elastic Loadbalancer, три экземпляра EC2, на которых работают серверы Tomcat, и Elasticache. Есть рецепт Chef, который я запускаю при загрузке, который, помимо прочего, настраивает каждый файл context.xml Tomcat для указания на Elasticache.
Мне интересно, как лучше всего настроить Elasticache в рецепте, поэтому все, что мне нужно сделать, - это сделать быстрые изменения в шаблоне CloudFormation, чтобы вызвать их несколько (stack1 -asticache, stack2-asticache и т. Д.)
Прямо сейчас у меня просто есть жестко замененная замена переменных (не идеально для Chef, так как любое изменение будет обновляться на каждой коробке Chef'd, если нет отдельного рецепта для каждого), но мне интересно, есть ли способ использовать CLI AWS и ленивый анализ узла шеф-повара, чтобы сделать что-то вроде:
ruby_block 'Get Elasticache endpoint' do
block do
node.run_state['elasticache'] = `some aws command to get the Elasticache endpoint I want`
end
end
source "context.xml.erb"
variables(lazy{
{
:tomcat_version => elasticache
}
}
Меня сбивает с толку то, как получить имя Elasticache от Amazon. Я планирую сделать что-то очень похожее на мой пример, увеличивая количество каждого нового Elasticache, и их схема именования будет соответствовать Tomcats (stack1-TC1, stack2-TC2 и т. Д.). Как мне этого добиться?
1 ответ
Вы можете проверить гем AWS ruby SDK, который можно использовать либо в библиотеке Cookbook, либо в провайдерах для получения сведений о времени выполнения. Ниже ссылки и некоторый код, который вы можете использовать.
http://docs.aws.amazon.com/sdkforruby/api/Aws/ElastiCache/Client.html#describe_cache_clusters-instance_method
Код:-
require 'aws-sdk'
def create_aws_interface(aws_interface)
if !new_resource.aws_access_key.to_s.empty? && !new_resource.aws_secret_access_key.to_s.empty?
creds = ::Aws::Credentials.new(new_resource.aws_access_key, new_resource.aws_secret_access_key)
else
Chef::Log.info('use iam profile')
creds = ::Aws::InstanceProfileCredentials.new
end
Aws.config[:ssl_verify_peer] = false
aws_interface.new(credentials: creds, region: new_resource.region)
end
def ec
ec ||= create_aws_interface(::Aws::ElastiCache::Client)
end
# It will return all Elastic cache clusters in object, which needs to be parsed further.
def getClusterID()
resp = ec.describe_cache_clusters({
marker: "String",
show_cache_node_info: true,
})
end