awspecをAWS Lambdaで動かす

概要

先日、AWS Lambdaでrubyがサポートされた とのことで、awspecを動かしてみました。

awspecはAWSのリソースのテストを行うRSpecベースのツールです。

実業務でも開発・運用に利用させて頂いており、品質担保には重要なソフトウェアです。

[toc]

構築

今回はサンプルとしてS3のバケットがあるパターン・ないパターンの存在チェックをそれぞれ行いました。

https://github.com/mickey390/aws-lambda-awspec

成果物はこちらのリポジトリにまとめました。手順はリポジトリ時に記載していますが、大体の流れは以下のようです。

  • ローカルで`bundle install`しLambdaに上げるライブラリを用意
    • Lambda用のIAMの作成は、Terraform(apex infra)を利用
      • ケースに合わせて、S3のReadとPutできるよう
  • Lambdaのデプロイ管理は、apex を利用
  • 処理自体は、、
    • 実行結果は、failedの場合はSystemExitをrescueし継続させた
    • 結果レポートは、html形式にして 出力し、S3に保存

実行すると↓RSpecのレポートが見られる

詰まった処

Lambda上で以下のようなエラーが出ました。環境変数$HOMEが設定されていないとだめなようで、このように 追加しました。

参考箇所

WARNING: Unable to find ~/.rspec because the HOME environment variable is not set.
Called from /var/task/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/exe/rspec:4:in `<main>'

実行環境としてのLambda

awspecの実行環境としては、EC2(バッチサーバみたい)やCI環境(CircleCI/Jenkins)などが多いようですが、EC2との比較を挙げてみます

  • コストに関して
    • Lambdaは安い
  • 構築に関して
    • 簡単
    • 既存のケースを移行するのも容易
    • EC2などの基盤を用意しなくてよいので、開発の初期から導入できる
  • ワークフローに関して
    • 実行のトリガーを、様々な用意できる
      • 定期実行(cloudwatch)
      • リポジトリ操作(マージ)時 (code build)
      • アレクサ?
    • 実行の結果の 処理も様々に用意できる(Layerの使い所?)
      • 結果に対してSlackなどで通知を送る
      • 結果をHTMLで人の目で見ることができる
    • 結果をjson形式で出力し、ログ基盤(Elasticsearchなど)に格納し監視の対象とすることもできそう

このようにメリットや可能になることも多そうなので、業務に導入する選択肢にも入ってきそう

気をつける点は、、

  • 当然ながらLambdaの実行時間やライブラリのサイズの上限を気をつける
    • awspecとrakeのサイズは75Mだった
  • 他の方が検証されているが、初回の実行はやはり時間がかかる
$ du -hs vendor
 75M    vendor

さいごに

  • awspecをLambdaで実行してみた
  • 構築は簡単
  • 構成管理ツールとも合わせて良いワークフローに変えて行きたい
  • Infratesterといった外形監視もLambda上で動かしてみたい

以上です。