InSpecをAWS Lambdaで動かす

はじめに

AWS Lambdaでrubyの実行がサポートされたので,前回のawspecに引き続き InSpecをLambda上で動かして見たいと思います.

InSpecはChefが中心となって開発されているOSSで、 Rubyで記述されたインフラに対するテストフレームワークです. Serverspecやawspecと似ていますが, セキュリティやコンプライアンスのチェックを目的として開発されたようです. 詳しい背景やServerspecとの違いなどは,以下のブログ記事(とその和訳)を読むとわかりやすいです.

The Road to InSpec - Chef Blog [和訳] InSpecへの道 #getchef - クリエーションライン株式会社

特徴の一つとして,テスト対象をOSのみならず AWS/Azure/GCPと複数のクラウドベンダをサポートしている点があるかと思います. InSpec Resources Reference

[toc]

環境の構築とテスト実行

今回はサンプルとして、 S3のバケットが存在する・存在しないかをテストするケースを AWS Lambdaに構築するInSpecで行います.

GitHub - mickey390/aws-lambda-inspec: Inspec(chef)をAWS Lambdaで動かすサンプル

リソースや手順などはこちらのリポジトリにまとめました. READMEを見ていただけるとわかるかと思いますが、以下補足していきます.

環境の準備

InSpecの取得はgemで行いますがmacOS上で取得したものをLambdaで実行するとエラーになったため, dockerでLambda環境を起動し, その内部でbundle installを行いました.

InSpec実行時に$HOME配下に.cacheディレクトリを作成しますが, Lambda上のデフォルトパス/var/taskには書き込み権限がないので, こちら/tmpに変更しています.

Lambda関数用のIAMの作成は,apex infra(Terraform)で行っています. 今回は,ケースに対応するためS3に対する読み込み書き込みとLambdaの実行やログに関する権限を作成しています.

Lambdaスクリプト

InSpecの起動は以下を参考しました. https://github.com/inspec/inspec/blob/master/lib/inspec/runner.rb#L25-L28 独自でタスクランナーを実装しているようなので、オプションの指定の仕方などはコードを確認する必要があります.

opts = { 'target' => "aws://"}
r = Inspec::Runner.new(opts)
r.add_target("spec")
r.run

GitHub - inspec/inspec: InSpec: Auditing and Testing Framework

add_targetの引数は、テストケースのファイルや格納ディレクトリを指定します. targetcliでのオプションです.

また,CLIでの実行時は以下にあるようにAWS_*環境変数の指定が必要ですが, InSpec Lambdaではすでに設定されているので、スクリプト内で明示しません. Lambda 実行環境と利用できるライブラリ - AWS Lambda

まとめ

  • InSpecをAWS Lambda上で動かしてみました
  • Lambdaで実行するとどのような場合で有用かなと考えましたが、、思い浮かびませんでした
    • 運用中の複数のクラウドにまたがったシステムに対するテストとかかな・・

以上です。