Как упоминалось выше, основной недостаток установки любой конфигурации crontab заключается в том, что это происходит только при развертывании. Поскольку кластер автоматически масштабируется вверх, а затем обратно, предпочтительно, чтобы он также был первым выключенным сервером. Вдобавок не будет переключения при отказе, что для меня было критично.
Я провел небольшое исследование, а затем поговорил с нашим специалистом по аккаунтам AWS, чтобы обсудить идеи и проверить решение, которое я придумал. Вы можете добиться этого с помощью OpsWorks , хотя это немного похоже на использование дома, чтобы убить муху. Также можно использовать Data Pipeline с Task Runner , но это имеет ограниченные возможности в сценариях, которые он может выполнять, и мне нужно было иметь возможность запускать сценарии PHP с доступом ко всей базе кода. Вы также можете выделить экземпляр EC2 вне кластера ElasticBeanstalk, но тогда у вас не будет повторного переключения при отказе.
Итак, вот что я придумал, что, по-видимому, нетрадиционно (как прокомментировал представитель AWS) и может считаться взломом, но он работает и надежен с отказом. Я выбрал решение для кодирования с использованием SDK, которое я покажу на PHP, хотя вы можете использовать тот же метод на любом языке, который вам больше нравится.
// contains the values for variables used (key, secret, env)
require_once('cron_config.inc');
// Load the AWS PHP SDK to connection to ElasticBeanstalk
use Aws\ElasticBeanstalk\ElasticBeanstalkClient;
$client = ElasticBeanstalkClient::factory(array(
'key' => AWS_KEY,
'secret' => AWS_SECRET,
'profile' => 'your_profile',
'region' => 'us-east-1'
));
$result = $client->describeEnvironmentResources(array(
'EnvironmentName' => AWS_ENV
));
if (php_uname('n') != $result['EnvironmentResources']['Instances'][0]['Id']) {
die("Not the primary EC2 instance\n");
}
Итак, рассмотрим это и то, как это работает ... Вы вызываете скрипты из crontab, как обычно, на каждом экземпляре EC2. Каждый скрипт включает это в начале (или включает по одному файлу для каждого, как я его использую), который устанавливает объект ElasticBeanstalk и извлекает список всех экземпляров. Он использует только первый сервер в списке и проверяет, совпадает ли он с самим собой, что, если он это делает, продолжает, в противном случае он умирает и закрывается. Я проверил, и возвращенный список кажется согласованным, что технически должно быть согласованным только в течение минуты или около того, поскольку каждый экземпляр выполняет запланированный cron. Если это действительно изменится, это не имеет значения, поскольку опять же, это актуально только для этого маленького окна.
Это ни в коем случае не изящно, но соответствовало нашим конкретным потребностям, которые заключались не в увеличении стоимости за счет дополнительной услуги или необходимости иметь выделенный экземпляр EC2, а также в случае отказа в случае отказа. Наши сценарии cron запускают сценарии обслуживания, которые помещаются в SQS, и каждый сервер в кластере помогает выполнять. По крайней мере, это может дать вам альтернативный вариант, если он соответствует вашим потребностям.
-Дэйви