EC2のCronで動作しているバッチをLambda上で動かしてみた
こんにちは。最近社内の工数管理システムをAWS上へ移設していた浅見です。
そのタイミングで日次バッチ処理をLambda上へ移設してみようと思い立ちました。
Lambda未経験な私ですが、「とりあえずやってみる」の精神です。その中で調べてわかったことをまとめてみようと思います。
Lambdaの利用経験がある人にとっては当たり前のことかもしれませんが、Lambdaって何?という人に雰囲気が伝わればうれしいです。
目次
Lambdaへ移設予定のバッチ処理
- DB(MySQL)のデータを集計
- 集計結果をWebhookを使いSlackへ通知
社内システムと同一サーバ上のcronで日次で動かしており、言語はPHPで作成しています。
構成は社内システムということもありシングルAZです。
この簡単な構成のバッチをLambdaで動かそうとするとどのような形になるのでしょうか?Lambdaで動かすために初めて知ったこと
利用言語にPHPは存在しない
LambdaではPHPのサポートがされていませんでした。残念ながら書き直しとなります。
2018年4月現在でサポートされている言語は次の通りです。 - Java
- Node.js
- C#
- Python
公式ドキュメントによると「その他の言語も今後サポートする予定です。」ということなので今後に期待しましょう。
今回はPythonを利用してみました。RDSへアクセスさせるにはLambdaをサブネット上に配置する必要がある
バッチ処理からRDSへアクセスしてデータを集計する必要があります。
EC2・RDS間はセキュリティグループの設定のみで普通にアクセスできていました。あまり深く考えずにLambdaからRDS間も普通にアクセスできるだろうと思っていたらダメでした。
RDSはVPC内のプライベートサブネットにいるので当然ですね。
ということで、LambdaをVPC内のリソースへアクセスできるように設定が必要になります。
Lambda作成時にVPCと所属させるサブネットの選択ができるので、プライベートサブネットを2つ選択しておきましょう。
ポイントは「プライベートサブネット」と「2つ選択する」です。
前者は後述します。
後者の「2つ選択する」はコンパネ上から2つの選択が必須になっています。Lambda起動時にコンテナが起動しますが、2つサブネットを指定することで耐障害性を高めることが可能です。
サブネットはRDSと同じものではなく、Lambda用に新しく作成しました。Lambda-RDS間のセキュリティグループの許可が必要
同一VPC内のプライベートサブネットへ配置することでRDSへのアクセスが可能になります。
正常にアクセスさせるために、セキュリティグループの許可設定を入れておきましょう。ついでに、MySQLのユーザ作成も忘れずに。
Lambda起動時に任意のプライベートサブネットのIPアドレスが付与されるので、サブネットに割り当てているIPアドレスレンジを許可しておきます。サブネット上に配置するとインターネットにアクセスできなくなる
RDSの集計結果をSlackへ通知する必要があります。そのためにはインターネット経由でSlackのWebhookをたたかなければいけません。
が、、、LambdaをVPCに割り当ててしまうとインターネットへアクセスできなくなるようです。
これを回避するために、パブリックサブネットへ、NAT Gateway(またはNATインスタンス)を立てる必要があります。
NAT Gatewayを立てた後、Lambdaが所属するプライベートサブネットのデフォルトゲートウェイをNAT Gatewayへ変更し、インターネットへの接続環境を整えます。
デフォルトゲートウェイを変更する必要があるので、Lambdaはプライベートサブネットへ配置する必要があります。
ここまできてやっとバッチ処理を動かす環境を構築することができました。cron処理はCloudWatchで代行
cronで行っていた定時になったらバッチを実行する処理はCloudWatchを利用して行います。
注意点としてはUTC時間で記載する必要があることです。指定したい日本時間からマイナス9時間が必要です。
9時に実行させたい場合は、「Cron(0 9 ? )」ではなく、「Cron(0 0 ? )」と指定します。まとめ
せっかくAWSへ移設するので、AWSらしい機能を利用したいよね。ということでLambdaをはじめて利用してみましたが、環境を整えるのが結構大変でした。
NAT Gatewayを利用するとコストパフォーマンス的にどうなのか?という問題があるので、NAT インスタンスにして必要なときだけ起動するようにしたらいいかな?と考えています。
AWSを利用するさいには、適材適所で必要な機能を選ぶようにしていけるといいですね。