Day17. サーバーレスアーキテクチャの要「Lambda」とはなにか
※ひとりでIoTまるっとチュートリアル Advent Calendar 2018 17日目
AWSなどのクラウドサービスを使っていると、よく「マネージドサービス」や「サーバーレス」という言葉を耳にすることになります。よく聞くけど、その正体はいったい何なのか?そして、それらを実現する要となるLambdaについて紹介します。
目次
・マネージドサービスとサーバーレス
・「のり」としてのLambda
・【実践編】EC2の利用率を監視して、危険なときにSlackにエラーを投げる
マネージドサービスとサーバーレス
マネージドサービスというのは、運用(manage)をAWSが引き受けてくれるサービスのことです。
・冗長化・バックアップ
・障害対応
・モニタリング
などなど、コストと時間がかかるところを気にすることなく、サービス設計に集中できるようになっています。
特に、特定の要素に特化したサービスで、運用と保守をすべてAWSが行うようなサービスを、フルマネージドサービスと言います。例えばEC2は、仮想コンピュータを提供するサービスですが、それこそパソコン貸し出しと同じで、使い方は人それぞれです。そのの中身の運用は我々ユーザに委ねられます。
一方で、
・ストレージ機能に特化したS3
・ストリーム処理に特化したAmazon Kinesis
・データベース機能に特化したRDS/DynamoDB
などなど、用途が一つに決まっているものは、AWSがフルサポートをしてくれます。例えば、データ容量が増えると、自動的に性能を上げてくれたり、定期的にバックアップを取ったり、とにかくいろいろしてくれるわけです。
このような利点があるため、一般的にはフルマネージドサービスでシステムを構築するのが、保守運用のコストを抑えられて良いとされています。こうして組み立てられたアーキテクチャを、サーバーレスアーキテクチャと呼ぶのです。
IoTでは、時系列データを数多く取り扱います。その際のサーバーレスアーキテクチャとして、下記記事が非常に勉強になります。レイテンシ・取り出す頻度・コストのバランスが非常にうまく取れたお手本のようなアーキテクチャなので、構築の経緯も踏まえ、一度熟読することをおすすめします。
もちろんサーバーレスアーキテクチャはすべての用途にいいというわけではありません。以下にメリットとデメリットを載せてみました。正しく使えば便利なので、自分がやりたいことと照らし合わせて構築することが重要です。
サーバーレスアーキテクチャを学ぶには、下記の本がとてもいいです。原則の説明から、パターンの羅列、実際にサービス構築まで書かれていて、とても読み応えのある本です。AWSでサービスを作ってみたいという方は必読かなと。
「のり」としてのLambda
lambda式でもlambda architectureでもなく、LambdaというAWSのサービスで、サーバーレスアーキテクチャの要です。1つの実行関数自体をサービスとする(Function as a Service : FaaS)で、ユーザ側はそれがどこでどのように実行されているかを意識する必要がないのです。
詳しくは上述の本に書かれているのですが、AWSのフルマネージドなサービスをつなぎ合わせるのり(グルー)の役割を果たします。Lambdaを使えば、基本的になんでもかけるので、データの変換、統合、分解、機械学習など、様々なことができます。
実践編 : EC2の監視をさせてみる
今回は、EC2のアラートシステムをサーバーレスで作ってみます。
CPUを監視して、使用率が50%を超えたらアラートを上げるというやつです。
全体のアーキテクチャは以下の通りです。
シンプルですが、サーバーを介していないことがわかります(監視しているのはサーバーですが。。笑)これにより、こんな通知が来ます。
これで深夜でも対応ができて、安心です!!(白目)
以下、手順の紹介です。まずは、送り先のSlackのURLを取得します。Webhookといって、そこにリクエストを投げればSlackが届くようにできます。
ここからAWSでのシステム構築です。まず、Lambdaを作成します。
AWS内の別のサービスに値を渡すわけではないので、とりあえず既存のロールでOKです。そういう場合は、きちんとロールを設定しましょう。
Lambdaを作成できたら、その中にコードを書いていきましょう。
先ほど取得したslack webhookのURLと出したいメッセージを入力します。技術的にはslackに向かってrequestを投げているだけなので、そんなに難しくはありません。
import urllib.parse
import urllib.request
def lambda_handler(event, context):
url = 'slack webhook の URL'
message = ":cry: CPU utilization is over 70% !!"
params = urllib.parse.urlencode({"payload": {"text":message}}).encode("utf-8")
f = urllib.request.urlopen(url, params)
return
これで、Lambda⇒Slackの部分は完了です。テストで値が飛ぶと思うので、確認してもいいかもしれません。
次に、SNSの設定をします。判別がつくような適当な名前を付けましょう。
LambdaとSNSが作れたので、それらを紐づけます。AWSには、ARN(Amazon Resource Name)というのが各サービスのリソース毎に割り振られるので、それを使って紐づけていきましょう。
これで、SNS⇒Lambdaの設定は完了です。最後に、EC2の監視を有効にしましょう。デフォルトでは、ログを見ることはできてもアラームを上げないので、アラームを上げられるようにします。
最後に、アラーム条件を決めます。通知先をさっき作ったSNSに紐づけて。。サーバー監視システムの完成です!
まとめ
サーバーアーキテクチャについて、少し理解できたかと思います。そして、短期間でシステムを構築できることも実感していただけたかと思います。一方で、こんな簡単なアーキテクチャだけでも
・AWS外 : Slack
・AWS内 : CloudWatch/SNS/Lambda
というように、様々な登場人物が出てきます。つなぎには、Roleの設定なども必要なので、ハードルは少し高いかもしれません。自分が使いたい箇所とサーバーレスが向いているかを把握したうえでアーキテクチャ設計をしましょう。
さて、明日は、AWSでIoTをやりますよ!ついにAWSのクラウドにデータが上がります。ではではっ
前の日 : AWSを始めるにあたって、まず知っておきたいこと
次の日 : AWS IoT入門
サポートいただけると励みになります! よろしくおねがいします!!