• Время чтения ~3 мин
  • 10.09.2022

У AWS есть SDK почти для всех популярных языков, включая PHP. Эти SDK ведут себя очень похоже, используя одни и те же вызовы API и параметры.

Как правило, SDK хорошо используют сильные стороны каждого языка.

Давайте посмотрим, как использовать PHP SDK — это проще, чем вы думаете!

Настройка учетных данных

Все AWS SDK выполняют вызовы API для AWS. Для этого вам потребуются учетные данные IAM с правильной настройкой доступа, чтобы выполнять запросы вызовов API (роли и политики IAM).

Предполагается, что у вас есть разрешения на запуск Вызовы API, которые вам нужны, все SDK отлично справляются с обнаружением различных способов передачи учетных данных в SDK.

Вы можете увидеть список способов до получите SDK для чтения ваших учетных данных здесь. Не волнуйтесь, если они не все имеют смысл.

Вот суть:

  1. You can set environment variables
  2. You can have your ~/.aws/credentials file
  3. Your environment (EC2 server, CodeBuild environment, Lambda function, ECS environment) can "assume" a role (more advanced)

Есть и другие, еще более продвинутые способы настройки учетных данных, но эти являются наиболее распространенными.

Обычно я так и делаю одно из следующих:

  1. Setting up environment variables (via Laravel's .env file)
  2. Allow the SDK to read the ~/.aws.credentials file, usually done for local development

Если вы установите определенные переменные среды, SDK сделает все за вас. Если у вас не установлены переменные среды, SDK автоматически выполнит поиск файла ~/.aws/credentials.

Вот что похоже на создание нового объекта Ec2Client:

use Aws\Ec2\Ec2Client;
 
$ec2 = new Ec2Client([
    // Region is required if not set by an env var
    'region' => 'us-east-2',
 
    // API version
    'version' => 'latest',
 
    // Use a profile from ~/.aws/credentials
    // 'profile' => 'your-profile-here'
]);

Создание команд

Каждый язык имеет свою собственную справочную документацию по API. Документация по PHP находится здесь.

Мы рассмотрим пример использования Amazon EC2 API для создания сервера. При этом используются RunInstances< /code> (множественное число!) Вызов API.

Вот как выглядит создание сервера EC2:

// $result: ['Location' => 'us-east-2']
$result = $ec2->runInstances([
 
    // ImageId: https://cloud-images.ubuntu.com/locator/ec2/
    'ImageId' => 'ami-0b29b6e62f2343b46',
    'InstanceType' => 't3.small',
 
    // Optional parameters you likely want to define
    // 'KeyName' => "some-key",
    // 'SecurityGroupIds' => ['sg-foobar'],
    // 'SubnetId' => 'subnet-foobar',
 
    'MaxCount' => 1, // You can create multiple servers
    'MinCount' => 1, // but we'll just create one
 
    // Create the root disk volume
    'BlockDeviceMappings' => [
        // Can usually assume this is the correct
        // root device name
        'DeviceName' => '/dev/sda1',
        'Ebs' => [
            'DeleteOnTermination' => true,
            'VolumeSize' => 8,
            'VolumeType' => 'gp3',
        ],
    ],
]);

Официанты

Одной из упускаемых из виду функций SDK являются "ожидатели", которые позволяют вам ждать, пока ресурс не достигнет определенного состояния.

Это полезно, чтобы обойти времена, когда вы пишете что-то вроде:

while(/* server is not yet running */) {
    // Check if server is running
}

Поверьте мне, вы в конечном итоге будете писать такой код при написании кода для AWS.

Официанты не всегда хорошо документированы, в зависимости от SDK. PHP, к счастью, хорошо документирован. Например, на странице EC2 мы можем прокрутить страницу вниз и увидеть доступные ожидающие.

Мы будем использовать ожидание InstanceRunning. Обратите внимание, что это говорит нам, что этот официант использует операцию API DescribeInstances. Это означает, что параметры, которые мы передаем, используются для этого вызова API.

Давайте посмотрим, как это выглядит:

$result = $ec2->runInstances([/* ... */]);
 
// We only created one instance, so we can assume
// the zeroeth array index
$instanceId = $result['Instances'][0]['InstanceId'];
 
$ec2->waitUntil('InstanceRunning', [
   // Can pass an array of instance ID's
   // We only have 1 instance
   'InstanceIds'  => [$instanceId],
   '@waiter' => [
       'delay'       => 3, // Wait 3 seconds between polling
       'maxAttempts' => 10, // Max attempts before failing, total of 30 seconds waited here
   ]
]);

Это приведет к ожиданию не более 30 секунд, прежде чем экземпляр перейдет в состояние "работает". Это 3 попытки с 10-секундным интервалом между каждой попыткой.

Если он не достигает этого состояния, возникает исключение тайм-аута.

Еще примеры

Если вам нужны дополнительные примеры, в этом репозитории есть примеры AWS SDK для нескольких популярных языков!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297