今回はs3の特定のフォルダ内にファイルがアップロードされたらLambdaを起動するようにしてみました。
その上で、LambdaからはGlueのジョブを起動させます。
Table of Contents
Lambdaとは
Lambdaとは簡単に言えばサーバ等の管理を必要とせず、コードを実行できるAWSのサービスです。
必要なときにだけ、勝手にコードを実行してくれるようなものです。
この辺のサイトをチェックするとわかりやすいかもしれません。
「Lambda」ってなにがスゴイんですか?
AWS Lambdaとは
ではこのサービスを利用して作業を行っていきますね!
Lambda用のロールの作成
最初にLambda用のIAMロールを作成します。
今回はジョブを動かすためにそれ用のロールを追加する必要があります。
では始めます!
まずはロールの作成。
そしたらAWSサービス、ユースケースの選択を行い、アクセス権限に進みます!
ではここで必要なポリシーを追加していきます。
今回は下記のポリシーが必要となります。↓
AWSGlueServiceRole
AWSLambdaBasicExcutionRole
この二つを追加すれば完成!
タグの追加、確認と済ませると後は完了となります。
では次のステップ、Lambda関数を作成していきましょう!
Lambda関数の作成
Lambda関数作成
ではLambda関数の作成へ移ります。
一から作成を選択。
関数名は好きなものを入れてください。
今回はpython3.8でLambdaのプログラムを書いていくのでpythonを選択。
そしてアクセス制限のところで既存のロールを選択し、先ほど作成したロールを選びましょう。
トリガーの追加
次にLambdaを起動させるためのトリガーを追加しましょう。
今回はS3の特定のフォルダ内にファイルがアップロードされるのをトリガーとしますね。
・バケット名を選択
・イベントタイプ→PUT
・プレフィックス→フォルダの場所(バケット名は除く)
↑上記のところを埋めて、トリガーを追加します!
エラー
トリガー間違えて作成しちゃったからもう一度作りなおそっ
みたいな時にはエラーが出るかもしれません。こんな感じの。
trigger の作成中にエラー が発生しました: Configuration is ambiguously defined. Cannot have overlapping suffixes in two rules if the prefixes are overlapping for the same event type. (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; Request ID: VAEDC4XZ4RK4Y5H4; S3 Extended Request ID: pXkTdB7nomKw64Nv2NbiXWEPDPaeyCIHsCyIqk5gmv7qNRVcywLNR98LDRGaFqwMFvLCFYpejFY=; Proxy: null)
この時に考えられるのがS3を見に行ってください。
関数自体のS3のトリガー設定は消えているけど、S3noバケットのトリガー設定が残っているようです。
多分…
そんな時はこれを参考にしてくださいね。
AWS Lambda関数の「Configuration is ambiguously defined」エラーへの対応
コードを書く
import boto3
glue = boto3.client('glue')
def lambda_handler(event, context):
response = glue.start_job_run(JobName = 'ジョブ名')
return response
Code language: JavaScript (javascript)
今回はこちらのサイトを参考にプログラムを作成しました。
AWS Glue を Lambda から起動して制御する (Python)
参考にした記事ではS3のデータを利用するようなコードになっていましたが、今回トリガーとして利用するだけだったので修正を加えました。
実際Lambdaからジョブ動かすだけだったらlambda_handlerっていらなくね?って思ったのですが、間違えでした。
lambda_handlerってのがあるからこそイベントが実行されるそうなのでこれは省かないようにしましょう。
ということで、コードが書けたのでデプロイして完了です。
コードが動くのかテストしてみましょう。
テストで動いたら今度はトリガーがうまく発動して、自動でコードが実行されるのかを確かめます。
トリガーテスト
さて、一通り作業が終わったので、S3にファイルをアップロードしてみましょう。
アップロードされた際に自動的に指定のジョブが動いていたらOKです!
あれ、ジョブが動かない!
ってなる場合はもしかしたら、フォルダ名が日本語になっていませんか?
トリガーを指定する際にプレフィックスで日本語のフォルダを選択した際にはうまくトリガーが発動しない可能性があるので確認してみて下さい!
前回ポリシーを作成するときにもS3の日本語フォルダに悩まされました…
またか!!!!
何とか終わって、全て完成!
というわけですね。
まとめ
今回は初めてLambdaを使ってみました。
プログラムをやっているといろんなことが自動化できるっていうのがわかってくるので楽しいですね。
もっとAWSのサービスもうまく使いこなしたい。。。
では。
[…] Lambda関数の作成←ここに関数の作成方法は記載しているので参考にしてみてください。 […]
[…] […]