はじめに
弊社製品のDataSpider Servista(以下DataSpider)にはファイルトリガーというファイル配置をトリガーに処理を実行する機能があります。
担当システムのクラウド移行に伴って、ファイル配置場所をS3に変更する案がありました。
大量のファイルトリガーで動く処理をいかに工数少なく移行するか、検証まで行いましたが、S3案はボツとなりお蔵入りになってしまいました。
せっかくなのでこの場でご紹介いたします。
構成
まず移行前の構成はこのようになります。
- 監視フォルダーでファイルを配置する
- DataSpiderのファイルトリガーが発火して処理が実行される
AWS移行後はこのような構成を検討しました。
- S3にファイルを配置する
- putイベントでLambdaを発火
- LambdaでDataSpiderに対してHTTPリクエストを行う
- DataSpiderのHTTPトリガーがじっこうS3からのファイルダウンロード処理が実行される
- ファイルダウンロードによるファイル配置により、DataSpiderのファイルトリガーが発火して処理が実行される
Lambda
Lambdaのコードはこのようになります。
import json
from urllib import request
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
url = 'http://【DataSPiderのパス】/dataspider/trigger/s3put_test?bucket='+bucket+'&key='+key
res = req(url)
return {
'url': url,
'res': res,
}
def req(url):
get_req = request.Request(url)
with request.urlopen(get_req) as res:
body = res.read()
return body
- イベント情報から「バケット名」と「キー」を取得する
- DataSpiderに対してHTTPリクエストを投げる
その際リクエストパラメータに「バケット名」と「キー」を設定する
特定のバケットからのputイベントでこちらのLambdaが発火するよう設定をしておきます。
DaraSpiderのスクリプト
DataSpiderの「S3ダウンロード」スクリプトはこのようになります。
- HTTPリクエストのパラメータの「バケット名」「キー」を元にS3から監視フォルダへファイルをダウンロードする
- ダウンロードが成功したらS3のファイルを削除する
まとめ
共通処理のLambdaとDataSpiderの処理を作成することで、ファイルトリガーで実行するDataSpiderの各処理の修正を不要とすることが出来ました。
今回利用機会はありませんでしたが、今後AWSを活用していく中で活用できればと考えています。