AWS Batch を動かしてみる

#概要
AWS Batchを一通り動かしてみる。

↓の続きです
[AWSでバッチ処理をするときの方法を考える](http://qiita.com/u3h/items/b649bf4a4e0b2800f500)

# 実践
※参考にしたサイト
[API Gateway + LambdaでAWS BatchのJobを実行する]
(http://dev.classmethod.jp/cloud/aws/submit-batch-job-with-api-gateway-and-lambda/)

##1. AWS Batchを作成
AWS Batchを開きます。

<img width="800" alt="スクリーンショット 2017-08-14 17.20.26.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/f5b1bb65-3b86-2a6f-1ad5-ad7b58957136.jpeg">

色々入力するところがあるけど全部デフォルトでいいです。
<img width="705" alt="スクリーンショット 2017-08-14 19.04.19.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/132c2577-479c-0223-5ebc-a89d0c33b66c.jpeg">

<img width="605" alt="スクリーンショット 2017-08-14 19.48.45.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/bf30f5f5-4b4a-03b2-b545-22793f9ed632.jpeg">
そしてCreate。


<img width="1004" alt="スクリーンショット 2017-08-14 17.25.46.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/a011bbc9-c2c2-4f13-3cc0-61596eac25f4.jpeg">
実行直後はPriorityが1になっていればとりあえず問題ないはずです。
しばらく経つとするとRUNABLEに入り、SUCCEEDEDに入ればJob完了です。

LambdaからBatchを起動する際にBatchのjobQueueArnが必要なのでJob queuesから確認してメモしておきます。
<img width="1009" alt="スクリーンショット 2017-08-14 20.29.01.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/28990cd0-9b09-ae07-7bda-8263ea0a22e9.jpeg">

##2. AWS Batchを起動するLambdaの作成

まずLambda用の新規ロール作成からです。
下記のようなポリシーのロールを作成しておきます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "batch:SubmitJob"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```
ロールを作成したらLambdaを作っていきます。
<img width="825" alt="スクリーンショット 2017-08-14 17.30.50.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/1075e068-1874-3c39-0e8b-c05921dd539c.jpeg">

設計図は使用せずに 「一から作成」 を選択。
<img width="1016" alt="スクリーンショット 2017-08-14 17.31.03.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/0d6ebbcc-c955-1b63-9967-caf3cf950d0e.jpeg">

トリガーは追加せずに「次へ」。
<img width="1000" alt="スクリーンショット 2017-08-14 17.31.12.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/5fb3dc0d-c626-7cb0-cb6d-ae0204cd2e37.jpeg">

関数の設定です。
適当に名前を付けて、サンプル通りPython3.6を選びます。
<img width="960" alt="スクリーンショット 2017-08-14 17.42.22.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/04ec7ba7-e324-e0a1-e5c7-403a4e8d6667.jpeg">

Lambdaの関数コードは下記に書き換え。

```
import boto3
 
def lambda_handler(event, context):
 
    client = boto3.client('batch')
 
    JOB_NAME = event['JobNeme']
    JOB_QUEUE = "arn:aws:batch:ap-northeast-1:xxxxxxxxxxxx:job-queue/first-run-job-queue"
    JOB_DEFINITION = "first-run-job-definition:1"
 
    response = client.submit_job(
        jobName = JOB_NAME,
        jobQueue = JOB_QUEUE,
        jobDefinition = JOB_DEFINITION
        )
    print(response)
    return 0
```
※8行目 JOB_QUEUE = <1.で作成したBtachのQueue arnに書き換え>

ロールは「テンプレートから新規作成し、テンプレートは "AWS Batchアクセス権限" を選びます」
<img width="876" alt="スクリーンショット 2017-08-14 17.42.40.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/ba3dd8c7-639c-0266-ebd5-9a9a1fd5407e.jpeg">

次へ
<img width="885" alt="スクリーンショット 2017-08-14 17.42.49.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/1ffadd88-5458-0838-bc78-2a54d6b6f5bd.jpeg">

ざっくり確認しておきます
<img width="973" alt="スクリーンショット 2017-08-14 17.43.23.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/6961261e-d548-0f5f-71dc-303b8fe56619.jpeg">

<img width="971" alt="スクリーンショット 2017-08-14 17.43.29.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/f793822a-d79d-5430-e7fc-98be9b741396.jpeg">

おめでとうございます。
<img width="997" alt="スクリーンショット 2017-08-14 17.44.07.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/7a782f48-05e8-0179-de42-bc560917f5df.jpeg">



##3. LambdaのためのAPI Gatewayを作る

1. 先に作成したLambdaのトリガータブを開き「＋トリガーを追加」します
<img width="979" alt="スクリーンショット 2017-08-14 17.44.41.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/854b582f-f689-edaa-8091-2217abce43da.jpeg">


1. API Gatewayをトリガーとして設定して送信します。
<img width="603" alt="スクリーンショット 2017-08-14 17.46.24.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/ce248c2a-cdc1-a826-4230-540321611fcb.jpeg">

1. メソッドの作成からPOSTを追加します。
<img width="751" alt="スクリーンショット 2017-08-14 17.47.34.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/aa2988da-1102-ab01-1d68-b64e9207659d.jpeg">


1. 先に作成したLambdaのリージョンを選び、Lambda関数を選択します。
<img width="1123" alt="スクリーンショット 2017-08-14 17.49.06.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/d7eaa170-194b-3b43-0652-c024ea0e9ea5.jpeg">


1. APIをデプロイします。
<img width="629" alt="スクリーンショット 2017-08-14 17.49.35.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/140828e7-f31c-1590-f5f3-e93d9c265aa7.jpeg">


1. 実験ですがProdで特に問題ないです。
<img width="497" alt="スクリーンショット 2017-08-14 17.49.44.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/6f762029-6c41-0d42-a7b0-0e4bb3719e01.jpeg">

1. デプロイが完了するとURLが生成されます。
<img width="1021" alt="スクリーンショット 2017-08-14 17.49.55.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/647696e7-badd-499b-ffc9-b73a0c877b5e.jpeg">


##4. 動作確認
1. 生成されたurlにcurlでPOSTしてみます。

```
$ curl -X POST -d '{ "JobName" : "test" }' https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/prod/ToBatch/
```
1. コマンドラインに応答はありませんが、BatchのJob queuesに新しいJobが入ってきます。
<img width="1114" alt="スクリーンショット 2017-08-14 18.30.40.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193757/28b14bb3-7870-fe22-7830-27a8a0ef059c.jpeg">

##5. 完了
一旦これで実用的な形になったと思います。
あとはJobに自分の処理内容を乗せておけば、APIでいつでも実行可能となります。