(Google+)105105件のシェア(ちょっぴり話題の記事)この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。Lambdaファンクションの管理ツールApexをご紹介したいと思います。Lambdaファンクションをビルド、デプロイ、管理するためのツールです。Lambdaのユーザビリティの低さに不満を持っており、その問題を解決するためにApexの開発に至ったようです。設定の継承、オーバーライドが可能(プロジェクトレベルでの設定を、ファンクションレベルで継承/オーバーライドできる)apexコマンド実行時にJSONストリームを渡せる透過的なデプロイパッケージ(zipファイル)の作成(デプロイ実行時に自動的にzipファイルが生成される)Terraformのインテグレーション(AWSリソースの作成にTerraformが利用出来る)「.apexignore」で特定ファイルをデプロイパッケージからが除外できるファンクションのロールバックに対応ファンクションのログをTailで参照可能ファンクションのデプロイの並列実行Dry-runでデプロイ前にファンクションの変更箇所を確認可能VPCサポート個人的にはGolangのサポートが目を引きますが、その他にも便利機能が満載です。詳しくは後ほど触れたいと思います。サポートされているランタイム本ブログ記事執筆時点の最新版であるv0.7.2でサポートされているランタイムは以下の4つです。Node.jsGolangPythonJavaApexを使ってみるそれでは実際にApexの使い方について見ていきたいと思います。今回は以下の環境でApexの動作を確認しました。v0.7.2インストール以下を実行すると、/usr/local/binディレクトリ下にapexのバイナリファイルがインストールされます。sh動作確認のため、apexのバージョンを確認してみましょう。0.7.2アップグレードは以下のコマンドで簡単に実行できます。Xの他、Linux、OpenBSD、Windows用のバイナリが用意されています。AWSのクレデンシャルApexを使うには、ApexにAWSのクレデンシャル情報を渡す必要があります。CLIのそれと同じ方法が使えます。コマンド実行時にプロファイルを指定する~/.aws/credentialsに[default]以外のプロファイルを設定している場合は、apexコマンド実行時にプロファイルを指定することもできます。この場合リージョンの設定は~/.aws/configからは読み込まれないようで、あらかじめ環境変数AWS_REGIONで設定しておくか、apexコマンド実行時に--regionフラグで指定する必要があります。deployコマンド実行時に毎回プロファイル名とリージョン名を渡すのは若干面倒なので、複数のクレデンシャル情報を使い分ける場合は、direnvなどを使ってプロジェクトディレクトリ毎に(1)の環境変数を設定するのが良いかと思います。Apexプロジェクトの作成v0.7.0でプロジェクトジェネレーターの機能が追加されました。これを使ってApexプロジェクトの雛形を作成します。initコマンドを実行します。descriptionを入力します。Lambdaファンクションのプレフィックスとして使用されるます(この設定は後で変更することが可能です)。infraというコマンドが追加されており、これがTerraformコマンドのエイリアスのような形になっています)。以降の入力項目は、Terraformを使う場合と使わない場合とで異なります。本ブログ記事ではTerraformについては解説しませんので、Terraformについて知りたい方は以下のブログエントリなどを参照ください。Lambdaファンクションに割り当てるIAMロールの入力を求められるので、あらかじめ作成しておきます。前提条件として、事前にTerraformをインストールしておく必要があるのでご注意ください。TerraformのstateファイルをS3で管理する場合は事前にS3のバケットを作成しておく必要があります。initで作成されたプロジェクトディレクトリを見てみます。project.jsonproject.jsonがプロジェクト全体の設定です。必須なのはname(プロジェクト名)です。その他メモリやタイムアウト値などのファンクションのデフォルト値をここで定義します。設定可能な項目については公式ドキュメントを参照ください。{}}functionsディレクトリ以下にファンクション毎にディレクトリを作成し、その中にファンクション本体(index.jsなど)を作成していきます(デフォルトで、サンプルとしてNode.jsのhelloファンクションが作成されます)。ファンクション毎の設定はfunction.jsonファイルで定義します。このfunction.jsonはファンクション毎のディレクトリ(helloなど)に配置します。必須項目はdescription、runtime、memory、timeout、roleの5つです。description以外の定義はproject.jsonから継承できるので、project.jsonで定義済みのデフォルト値を使う場合はfunction.jsonでの定義は不要です。project.jsonで未定義の項目がある場合、またはproject.jsonの定義をオーバーライドした場合はfunction.jsonに定義を追加します。定義できる項目はほぼproject.jsonと同じです。こちらも詳しくは公式ドキュメントを参照ください。project.jsonTerraformを使うことを選択した場合はinfrastructureディレクトリが作成されます。中身はまんまTerraformです。applyを実行すると新規に「lambda_function」という名前のIAMロールが作成され、outputとしてIAMロールのarnが表示されます。それ以外のファイルやディレクトリ構成は基本的にTerraformを使わない場合と同じですが、Terraformでロールを新規作成することを想定しているためproject.jsonのroleの定義は手動で追加する必要があるのでご注意ください。{}}ファンクションのデプロイ試しにデフォルトで作成されるhelloファンクションをデプロイしてみます。index.jsを以下のように書き換えます(後ほどファンクションの動作確認をするため)。})}helloディレクトリ下に以下のようなfunction.jsonを作成します。<ファンクション名>を実行すると指定したファンクションがデプロイされます。deployのようにファンクション名を指定しなかった場合はfunctionsディレクトリ以下の全てのファンクションがデプロイされます。invokeでファンクションを実行できます。プロジェクトディレクトリ直下に以下のようなevent.jsonを作成して、これを渡してみます。event.json{"hello":"world"}このほかにもイベントを渡す方法がいくつかありますので、詳しくは公式ドキュメントを参照ください。listで、プロジェクトに含まれるファンクションの一覧が表示されます(デプロイされていないものも含めて表示されます)。versionは表示されません。<ファンクション名>でデプロイしたファンクションを削除することができます。ファンクション名を指定しなかった場合は全てのファンクションが削除対象となります。buildでビルド処理のみを実行します。<バージョン番号>を実行します。バージョン番号を指定しなかった場合は1つ前のバージョンにロールバックされます。<ファンクション名>でファンクションの実行ログを表示できます。ファンクション名を指定しなかった場合は全てのファンクションのログが表示されます。1hで直近1時間のログを表示など。デフォルトでは直近5分のログが表示されます)。メトリクスを表示することができます。ファンクション名を指定しなかった場合は全てのファンクションのメトリクスが表示されます。runが実行可能です。--dry-runを実行すると以下のように出力されます。1+はリソースが作成されることを表します。--dry-runを実行してみます。$LATEST~はリソースが更新されることを表します。deleteでも使えます。リソースの削除は-で表されます。apex-sample_helloフック以下のフックがサポートされており、apexのライフサイクルの中で任意のコマンドを実行することが可能です。デプロイ実行後(使用例:ビルドで生成されたファイルを削除する)これらのフックはproject.jsonまたはfunction.jsonで定義します。具体的な使用方法として、Apexのgithubレポジトリにdeployフックを使用してbrowserifyを実行する例があります。この例ではproject.jsonbuildフックでbrowserifyでindex.jsをmain.jsにトランスパイルし、cleanフックでそのmain.jsを削除する、という処理が定義されています。環境変数Apexでは環境変数を使うことが可能です。deploy実行時)に--envフラグで定義します。以下は環境変数「LOGGLY_TOKEN」を定義して「using-env」ファンクションをデプロイする例です。using-env実態としては、ビルド時に.env.jsonと_apex_index.jsが生成され、デプロイパッケージ(zipファイル)に同梱される形となっています。require('./index').handleファンクション内では、Node.jsであればprocess.env.LOGGLY_TOKENで、Golangであればos.Getenv("LOGGLY_TOKEN")で値を取得します。})}環境変数は--envフラグで定義する意外にproject.jsonまたはfunction.jsonのenvironmentで定義することも可能です。}}.apexignore.apexignoreで、特定のファイルをデプロイパッケージ(zipファイル)から除外することができます。書式は.gitignoreと同じです。Golangのソースファイルをデプロイパッケージから除外するには以下のような.apexignoreを作成して、プロジェクトディレクトリまたはファンクション毎のディレクトリに配置します。*.goなお、デフォルトで.apexignore自身とfunction.jsonはデプロイパッケージから除外される設定になっているので.apexignoreで定義する必要はありません。included"の言葉通り豊富な機能を持ったApexですが、とてもシンプルで使いやすいと感じました。Terraformとのインテグレーションも今後の進化が楽しみです。Gatewayを作成する例も試してみたいと思います。528,576Rust始めました。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。カフェ店長のオカノです。今日はオフィスに用があるので、通勤ラッシュを避けて出社しました。この子は新メンバーのさめくんです。在宅勤務が推奨されているのでオフィスが閑散としており、すこしさみしそうです。使いたいときの注意点を書きました。本が出ていたので読んでみたところよかったので紹介させていただきます。