AWS SDK for PHPを使ってAWS BatchにsubmitJobする

March 10, 2019

※テスト的に下記記事と同内容を投稿しています。
※qiitaの投稿は消してこちらに統一しました。

はじめに

AWS Batchは、ほどよくマネージドなジョブキュー/ワーカーサービスとして使用できます。
ジョブはDockerコンテナなのでポータブルでありつつ、キューやワーカーの実行環境といったアプリケーション(というかビジネスロジックというか)から切り離せるレイヤはマネージドなサービスでユーザはあまり管理しなくていい。
というわけで個人的にけっこう気に入っているサービスなのですが、同じAWSでもECS/EKS/Fargateといったコンテナサービスと比べると何となく地味で目立たない存在。。。
だからというわけではないですが、最近表題のとおりphpからAWS Batchジョブを実行する機会がありましたのでサンプルコードをご紹介します。

実現すること

表題の通りで、AWS BatchのsubmitJobとは要はエンキューしてワーカーに非同期で仕事させるということです。

前提条件

事前準備

AWS SDK for PHPのインストール

composerも何もない前提で書きます。
それぞれ以下のコマンドを実行。

composerをダウンロード

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

ref. https://getcomposer.org/download/

AWS SDK for PHPのインストール

php -d memory_limit=-1 composer.phar require aws/aws-sdk-php

ref. https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/getting-started_installation.html

サンプルコード

AWS SDK for PHPをインストールしたディレクトリに以下のファイルを保存します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

require __DIR__ . '/vendor/autoload.php';

use Aws\Batch\BatchClient;
use Aws\Batch\Exception\BatchException;

$config = [
   'version' => '2016-08-10',
   'region' => 'ap-northeast-1'
//    'credentials' => [    // Only if you need :)
//        'key' => 'credential_key',
//        'secret' => 'credential_secret'
//    ]
];

$args = [
   'jobDefinition' => 'test-batch-job',
   'jobName' => 'test-batch',
   'jobQueue' => 'test-queue',
   'parameters' => [
       'param1' => 'hoge',
       'param2' => 'fuga'
   ]
];

$batch = new BatchClient($config);

try {
    $result = $batch->submitJob($args);
    print 'jobName: ' . $result['jobName'] . "\n";
    print 'jobId: ' . $result['jobId'] . "\n";
} catch (BatchException $e) {
    print $e->getMessage() . "\n";
    exit(1);
}

exit(0);

実行

$ php ./submit-job.php
jobName: test-batch
jobId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

マネジメントコンソール等からも実行状況が確認できます。

蛇足

ここでは便宜的にペライチスクリプトとしてご紹介しましたが、実際のアプリケーションに組み込む場合はビジネスロジックが直接AWS Batchをさわるのではなく、1枚ラッパー的な層を挟んでそいつにエンキューってノリにしたほうが良いかと思います。
せっかくほどよくマネージドなジョブキュー/ワーカーサービスなので、アプリケーションも極力それに依存しない書き方ができるといいですね。

参考文献

AWS SDK for PHP バージョン 3 の要件と推奨事項 - AWS SDK for PHP
AWS SDK for PHP バージョン 3 の基本的な使用パターン - AWS SDK for PHP

@j_untanaka on Twitter

AWSAWSBatchphp