Моему работодателю необходимо добавить теги к экземплярам AWS ec2, запущенным в OpsWorks, после их подключения к сети.
Все экземпляры - это MS Windows Server 2012 R2 Base в этом стеке. Цель состоит в том, чтобы добавить пользовательские теги, такие как «application»: «foo», к экземплярам, запущенным в стеке Foo и «application»: «bar» в стеке Bar.
Я нашел github repo chef-aws-tag который, я думаю, сделал бы то, что мне нужно, если бы я запускал Chef 11 в Linux. OpsWorks поддерживает только Windows Server 2012 и только с Chef 12.2.
Когда я добавляю рецепт chef-aws-tag из репозитория github к событию жизненного цикла установки, экземпляр выходит из строя в «running_setup» с «setup_failed».
Затем журнал сбоев Chef сообщает об этом сбое на этапе running_setup:
INFO: HTTP Request Returned 412 Precondition Failed : No such cookbook: aws
ERROR: Running exception handlers
FATAL: Net::HTTPServerException: 412 "Precondition Failed "
Это соответствует зависимости в metadata.rb, строке: depends 'aws', '>= 0.2.4'
Я понимаю, что зависимость отсутствует. Мне непонятно, как выполнить эту зависимость. Рецепт находится в S3, URL-адрес репозитория https://s3-us-west-2.amazonaws.com/employer/ec2instance-tagging.zip
Когда я добавляю рецепт в событие «Настроить жизненный цикл», компьютер подключается к сети без ошибок, но теги не добавляются. «Стандартные» теги появляются для экземпляра ec2; Ключи «opsworks: instance», «opsworks: layer: foo_layer», «opsworks: stack» и «Name» имеют ожидаемые значения. Теги, которые я хочу добавить через рецепт («приложение», «команда», «среда»), отсутствуют.
Пользовательский JSON добавляется на уровне стека:
{ "aws-tag": {
"tags": {
"team": "specialteam",
"application": "foo",
"environment": "development"
}
}
}
Есть ли специальный рецепт или поваренная книга для OpsWorks AWS, который я должен вызвать, чтобы установить теги на экземплярах после загрузки? Как мне назвать этот рецепт?
Я читал это Сообщение в блоге AWS об использовании OpsWorks для настройки развертывания приложений. Мне не хватает идентичного рецепта или кулинарной книги "установить теги aws на экземпляре через шеф-повара", которые есть в Amazon Web Services - Лаборатория репозиторий на GitHub?
В aws opsworks-поваренные книги на github скажите: «Для Chef 12.2 Windows и Chef 12 Linux нет встроенных кулинарных книг», но я надеюсь, что это неправильно :-) и что была добавлена кулинарная книга, которую я еще не нашел. В качестве альтернативы, надеюсь, кто-то уже сделал это и где-то задокументировал.
Я устраняю это после этого сообщения в блоге AWS Быстро изучить среду Chef в AWS OpsWorks (снова написано для Linux) и это Вопрос SF по отладке Chef на Opsworks
Я смог разобраться в этом самостоятельно. Открыв обращение в AWS Support, я получил достаточно указаний для решения этой проблемы.
Различная структура каталогов поваренной книги для разных платформ при использовании архивного файла.
Если вы предоставляете свои рецепты через архивный файл, хранящийся на AWS S3, AWS требует одну структуру каталогов для Linux и другую, другую, структура каталогов для Windows.
Linux может поместить несколько кулинарных книг в один корневой каталог. Это то, что $ berks package
делает по умолчанию.
Windows не принимает этот корневой каталог. В $ berks package
команда не имеет возможности создать один архив с несколькими кулинарными книгами, как это допускает Windows. Пришлось редактировать tar-файл вручную.
Ruby в Windows
Есть "error: Seahorse::Client::NetworkingError: SSL_connect"
ошибка которые могут появиться в кулинарной книге aws. AWS требует https между сервисами. Для этого требуется рабочий пакет центра сертификации. Ruby в Windows не может получить доступ к набору сертификатов ЦС ОС. Это можно исправить, если:
а) вы устанавливаете гем aws-sdk, затем
б) укажите в рецепте путь к curl-ca-bundle.crt
Подробная информация о зависимостях и рецептах сообщества.
В документация по AWS для Chef 12 в Windows не упоминает ни Berksfile, ни поваренные книги сообщества. Эти задокументировано на AWS для Chef 11 в Linux.
Уточнить область при вызове обновления.
Странно, что запуск рецепта на экземпляре говорит, что экземпляр не существует.
FATAL: Aws::EC2::Errors::InvalidInstanceIDNotFound: aws_resource_tag[i-5ccd24d4] (stemsoft::default line 27) had an error: Aws::EC2::Errors::InvalidInstanceIDNotFound: The instance ID 'i-5ccd24d4' does not exist
Коды ошибок AWS говорит, что InvalidInstanceID.NotFound может быть вызван а) нахождением за пределами региона или б) идентификатором недавно созданного экземпляра не распространяется через систему.
Исправление должно включать region stack['region']
в aws_resource_tag
блок рецепта.
Правильные политики, привязанные к правильным ролям
Убедитесь, что как aws-opsworks-ec2-role, так и aws-opsworks-service-role настроены с правильной политикой. 'aws-opsworks-service-role' можно оставить как есть, чтобы служба OpsWorks могла выполнять вызовы API к другим сервисам AWS. 'aws-opsworks-ec2-role', профиль экземпляра IAM по умолчанию, требует разрешения на ec2 для создания и описания тегов.
Целью описанных ниже шагов является создание стека OpsWorks, который запускает Chef 12 на Microsoft Windows Server 2012, с (настраиваемой) поваренной книгой, содержащей рецепт для установки настраиваемого тега. Тег получает информацию из пользовательского json, установленного в стеке в моем примере.
Я не нашел существующей кулинарной книги, которая бы это сделала. Я лучше буду использовать существующую поваренную книгу, чем создавать собственную поваренную книгу.
В конце этой процедуры в рецепте используется поваренная книга сообщества шеф-поваров 'aws' для обновления тега "team" из значений, установленных в пользовательском json, определенном в настройках стека.
Для этого рецепт получает подробную информацию об экземпляре, используя поиск в существующем пакете данных. Он также получает информацию о регионе, используя поиск во втором существующем пакете данных.
(У меня это сработало ....)
git-bash.exe
chef generate cookbook cookbook_dir
$ chef generate cookbook cookbook_dir --berks --copyright 'EMPLOYER' --email 'administrator@employerexample.com'
depends 'aws'
$ ruby -c /path/to/cookbook_dir/recipes/default.rb
$ berks install
для инициализации файла berksfile и отслеживания зависимостейcookbook 'aws'
$ berks package
построить cookbook_dir.tar.gzINFO: AWS: Updating the following tags for resource i-12345678 (skipping AWS tags): { .... "team"=>"teamFooBar"}
Пример рецепта example::default.rb
Chef::Log.info("********** from custom json, Team is '#{node['aws-tag']['tags']['team']}' **********")
instance = search("aws_opsworks_instance", "self:true").first
Chef::Log.info("Instance id from data bag: #{instance['ec2_instance_id']}" )
stack = search("aws_opsworks_stack").first
Chef::Log.info("********** stack['region'] from data bag: '#{stack['region']}' **********")
include_recipe 'aws'
chef_gem "aws-sdk" do
compile_time false
action :install
version node[:aws][:aws_sdk_version]
end
ruby_block "Set the AWS Bundle" do
block do
require 'aws-sdk'
Aws.config[:ssl_ca_bundle] = 'C:\ProgramData\Git\bin\curl-ca-bundle.crt'
end
action :run
end
aws_resource_tag instance['ec2_instance_id'] do
tags('team' => node['aws-tag']['tags']['team'] )
region stack['region']
action :update
Chef::Log.info("********** updated tags('team') **********")
end