Динамически получать конечную точку 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
Другие вопросы по тегам