2018年5月24日木曜日

【AWS Lambda】関数作成3

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

最近、AWSをフル活用して社内システムを作ったので、そのノウハウのご紹介を行っています。

現在はAWS Lambdaの使い方を紹介中です。

前回からまだまだ続いてLambda関数のコンソール画面を調査中です。

関数コード



関数コードは、Lamda関数を実行した時に叩くロジックの管理です。

リッチエディター形式になっていますが、こんな所で実装する人いるのかしら?
普通はローカルで開発してアップロードでしょ。。。

基本は手元で開発したソースをzipファイル等の形式に圧縮してアップロードすることで展開することになります。
アップロードはコツがいるみたいなので、後日検証。

「ハンドラ」という項目がありますが、これは「実行した時に最初にどのメソッドを叩くの?」ということを設定する所です。
これについても後日検証。

環境変数



環境変数は、その名の通り環境変数。
実行環境に応じてパラメータを変えたい時に使用すると便利なものです。

代表的なものとして、秘密情報でしょうか。

例えば「本番環境用のDB接続用パスワード」をGitHubにブチ混んでいてはマズいわけですよ。

そういう時はパスワードは環境変数から取得することで、ローカルではローカルの設定でDB接続し、本番では本番環境変数でDB接続出来ます。
コミットファイル中にはパスワードが存在しないので安心ということです。

項目「暗号化の設定」は、それを更に推し進めたもののようです。

「Lambdaの画面開いたらパスワード丸見えなんだけど?」というのを避けるため、Lambdaコンソールから見える文字列も暗号化しておいてくれるという物です。

そしてソース中で復元する時は、ちゃんと元の文字列になっています。

当然ですが、パスワードをログ出力していたらブチ怖しなのでご注意を。

タグ

タグは、Lambda関数の目印です。
「メールのフォルダ分け」と似たようなもので、Lambda関数が増えてくると探すのが大変になるから、タグをつけて整理出来るようにしておくというものです。

実行ロール

ロールとは権限を管理する機能です。

つまり「この関数はS3にアクセスして良い」というような実行権限を付与するための項目です。
正しく設定しなければもちろん動きません。

関数が増えてくると、こういう所もキチンと整備し、必要最小限の権限のみを付与することで、システムの保守性が上がるわけです。

基本設定


「基本設定」は寄せ集め項目なので、適当なネーミングにしたのでしょうね。。。

説明

関数についてコメントを書いておくもの。

メモリ

重要項目。

Lambdaではメモリを関数に任意でセットします。
ここで設定しているメモリを2倍にしたら、コストも2倍というシビアな項目です。

従って、Lambda関数はメモリ節約こそが大正義ということを意味します。

最近はサーバの性能が上がってメモリも十分に搭載されており、メモリの使用量なんか全く気にしなくてOKという開発が増えてきました。
しかしLambdaでそれは通用しません。

コスト削減のため、「メモリ節約」「処理速度向上」は極限まで追求しなければならないのです。

最小は128MB、最大は3GB。

タイムアウト

関数が開始から終了までに許容する時間です。
現状だと5分が上限です。

Lambdaは小さい処理を大量実行するモデルなので、一回の実行に何時間もかかるようなバッチは思想と合っていないので使用できません。

そういう時はLambdaを使わないという選択肢もありますが、私はデータの範囲を分けて関数を複数起動するなど、あくまで小さなバッチの集積体という思想に従った方が保守性の高いシステムになると思います。

なお、この画面で設定する値の値は5分ですが、ここで設定する値はLambdaのタイムアウト時間で、HTTPリクエストに対応するAPI Gatewayトリガーの最大時間は90秒だったりします。

なので、

「あれ??? タイムアウト時間を5分に設定しているのに、90秒でエラーになっちまうぞ!?」

ということが起きるんですよ。

これは罠です。

続く

関数のパラメータ解説はもう少し続きます。

2018年5月18日金曜日

【AWS Lambda】関数作成2

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

最近、AWSをフル活用して社内システムを作ったので、そのノウハウのご紹介を行っています。

現在はAWS Lambdaの使い方を紹介中です。

コンソール画面

前回からの続きでコンソール画面を見ていきたいと思います。

画面の上の方から行きます。



一番上に「アクション」とかボタンが並んでいますが、この辺りは作った関数をキックしたりする部分です。
これについては後続の記事で書きますので、次に進みます。

デザイナー

デザイナーは、Lambda関数を頂点に、それ以外のAWSサービスを紐づけるための機能です。

初期状態では以下二つがぶら下がっています。

  • Amazon CloudWatch Logs
  • Amazon DynamoDB


Amazon CloudWatch Logs

Amazon CloudWatch Logsは、Lambdaのログを出力するサービスです。

通常のシステムの場合、ログはログファイルに吐き出してローテーションするものですが、Lambdaのようなサーバレスのサービスの場合、無意識に使えるディスクスペースは基本ありません。
なので「ディスクスペースに吐き出す」みたいな簡単な処理に工夫が必要になってきます。

ディスクスペースの代わりにログを吐き出す先、それがAmazon CloudWatch Logsです。

イメージとしては、恐らくNoSQL型のDBにログを保存しているのだろうと思います。
そしてCloudWatchの画面でそれを参照する、というカラクリです。

CloudWatchの画面イメージはこちら。


CloudWatchにログを出力するための実装方法は後日の記事にします。

Amazon DynamoDB

Amazon DynamoDBは、アマゾン自慢のNoSQLです。

【AWS Lambda】帳票出力API開発 その2~RDBMSを使うな~

で書きましたとおり、Lambdaと通常のRDBMSの組み合わせは基本、無いです。
代わりにNoSQLを使用します。

Lambda最大の制約はココ、NoSQLを使うしか無いう点でしょう。

でも性能的には最強なんです。
最近、私はずっと「既存システムをNoSQLに置き換えることは出来ないか?」ということばかり考えています。

例えば、掲示板とかならイケるんですよ。

5ちゃんねる(旧2ちゃんねる)という掲示板がありますけど、あれってサーバ側にはテキストファイルが置いてあるだけでDBは使ってませんからね。

テキスト出力だけでやっている処理はNoSQLに置き換え可能です。

また、PukiWikiという有名なWikiツールがありますけど、あれもテキスト出力だけで実現しています。

LamdaとDynamoDBで実現するNoSQL・サーバレス型のWiki&掲示板というのは負荷の激烈増減というサービスの性質を考えると相性最強のはず。

何とかして自分で開発出来ないかと考えています。


トリガー

さて、最初からぶら下がっている二つは上記のとおりとして、気になるのは左側の「トリガー」です。

これは「何をキッカケとして、Lambda関数をキックするか?」ということを決定するための機能です。

例えば、


  • API Gateway:HTTPリクエストをトリガーとしてのキック


などですね。

以下のラインナップはあります。


  • API Gateway
  • AWS IoT
  • Alexa Skills Kit
  • Alexa Smart Home
  • CloudWatch Events
  • CloudWatch Logs
  • CodeCommit
  • Cognito Sync Trigger
  • DynamoDB
  • Kinesis
  • S3
  • SNS


すいません。
私が作ったシステムだと「API Gateway」か検証していなくて他は未検証なのですが、断片的に調査した情報だと以下の機能だと理解しています。

AWS IoT

AWS IoTというサービスと連動するもの。
例えば「目覚まし時計を叩いたら起動」とか、そういう用途が可能と思われます。

Alexa Skills Kit・Alexa Smart Home

噂のAI製品「Alexa」と連動するもの。

例えば「Alexa! 会議室は空いているか!?」とか話しかけると起動し、Lamdaの処理を経由して会議室予約システムとかと照合し、最終的には「C会議室が開いています」みたいな返事をするとか、
そういう用途が可能になると予想。

CloudWatch Events・CloudWatch Logs

ログ回り。
例えば「ログの中にFATAL」という文字が出現したらキックし、社員に緊急出勤させるような処理のためのもの。

CodeCommit

AWS CodeCommitというGitHubみたいなサービスがあるそうです。
プッシュ通知とか出せるのでしょう。

Cognito

Cognitoはシングルサインオンを管轄する機能です。
「ユーザがログインしたら起動」とか出来るものと予想。

DynamoDB

DynamoDBは上記のとおりのNoSQL。
テーブルの更新を察知することが出来ます。

RDBMSにも「トリガー」という機能がありますが、あれと似たような機能のようです。

Kinesis

Amazon Kinesis Data Streamsというストリーミング処理と連携。

例えば「動画の15分の所でCMを挟む」とかの用途と予想。

S3

S3はAWSの最初期からある伝統のディスクストレージ。

「特定フォルダにファイルがアップロードされたらキック」

SNS

SNS? FeceBookみたいな? と思ったら違いました

Amazon Simple Notification Serviceという、プッシュ通知を行ってくれるサービスがあるそうで。
プッシュ通知の中身をLambdaを使って構築しているのかな?



以上のとおり、沢山あります。

これらから分かるとおり、LambdaはAWS製品を使う上での基幹部分に位置する超重要サービスだと言えます。

AWSに関わっていくなら、Lambdaへの理解は必要不可欠と言って良いでしょう。


続く

引き続きLambdaの関数設定について調査していきます。

2018年5月11日金曜日

【AWS Lambda】関数作成1

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

最近、AWSをフル活用して社内システムを作ったので、そのノウハウのご紹介を行っています。

今回はAWS Lambdaで関数を作成するところまで行ってみましょう。

ログイン

ログインするためにはもちろんID登録をする必要があり、ID登録だけにも権限とか注意点があるのですが、そこは割愛。

ログインした所からスタートします。

以下が私のLambdaのコンソール画面です。

https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/functions


既に関数を作って稼働させているのでメニューに一つ関数があります。

ブログのストーリー進行の都合上、もう一個関数を作りたいと思います。

関数作成

右上にあるオレンジ色のボタン「関数の作成」をクリックします。

すると以下の画面に遷移します。



メニューが三つあります。

一から作成

説明文にあるように「Hello World」を出力するという、最小空っぽ構成でスタートするというものです。
一から全部自分で構築します。

設計図

メニューから選択し、最初からある程度構成された状態でスタートするものです。

初心者の自分としては「ゼロから構築するのは難しいし、最初からそこそこ動くなら便利そうだな」と思って私はこれを選択しました。

が、ハッキリ言って動かねえ!!

これね、確かに最初から多少なりともセットアップされた状態でスタート出来るのですけど、恐らくセキュリティとかの都合だと思うんですけど、とにかく疎通しない状態からスタートしやがるんですよ。

いや、とりあえず「テスト」とかやれば動くんですけど、「HTTPリクエストの受付」とか肝心なところになると全然ダメ。

初心者の自分には動かない原因なんて分からないですからね。
結局、一個一個理解してようやく動かすに至りました。

まあ、どんなもんかと思ってとりあえず設計図を選ぶと分かることもありますが、結局は一から作成するのと同じくらい理解に時間を費やす覚悟が必要です。

サーバレスアプリケーションのリポジトリ

これは私も未調査ですが、どうやら世界中のエンジニアが「私もAWSの関数を作ってみました。ぜひ使ってください」というのを公開しているようですね。


Yuji Nishimura.
西村 祐司さん? 日本人の方もいらっしゃるようです。

コメントを見る限り「挙動確認の為に試しに公開してみた」という物に見えます。結構フリーに公開出来る環境なようです。

探せば何か面白い関数が眠っているかもしれませんね。


さて、今回は「一から作成」で進んでいきたいと思います。

ランタイム

関数名は適当に「TacyBlogSample」として、次にランタイム。
実行言語を選択します。


2018年現在だと以下のラインナップです。

  • C# (.NET Core 1.0)
  • C# (.NET Core 2.0)
  • Go 1.x
  • Java 8
  • Node.js 4.3
  • Node.js 6.10
  • Node.js 8.10
  • Python 2.7
  • Python 3.6

え? 「PHPとかRubyとか無いんだけど? 俺こんな言語知らないよ?」って?
あなた、時代に乗り遅れてますよ!!

と言うのも、Lambdaのようなサーバレス環境は言語が固定されており、メニューの中に入っている言語しか使用出来ません。

どの言語をサポートするかはクラウド業者が決めますから、クラウド業者から見て評価の高い言語しか使用出来ないということです。

つまり、AWS様は「PHPとRubyなんでどうてもええわ」と思っているってことなわけですよ。見放されています。

今後クラウドを使っていきたい人はクラウド界で人気のある言語を習得するというスキルセット戦略を持つ必要があります。

私のオススメは断然「Python」です。
いくつかクラウドサービスを見てみましたが、Pythonは必ず優先的にサポートされています。

皆さんもぜひPythonを習得して下さい。

と言うわけで、とりあえずPython3.6を選択。

ロール

ロールというのは、権限設定です。

「この関数はファイルサーバに書き込みが出来る」
「この関数はログ出力が出来る」

とかそういうのです。

私は一人で小規模なアプリを開発しただけなので余り権限を意識していませんが、複数人で大規模なアプリを開発するとなると、権限を適切に割り振る設計も重要になってくるのでしょう。

余り気にしていないと言っても、

  • 「あれ? 動かないぞ?」 ⇒ 権限が無かった。

というのは都度都度発生しますので、重要です。

ともかく、今は適当に新規で作って先に進みます。



出来上がりました。

続く

今日のところはここまで。

次回から関数コンソールの中身を見ていきましょう。