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
の引数は、テストケースのファイルや格納ディレクトリを指定します.
target
はcliでのオプションです.
また,CLIでの実行時は以下にあるようにAWS_*
の環境変数の指定が必要ですが,
InSpec
Lambdaではすでに設定されているので、スクリプト内で明示しません.
Lambda 実行環境と利用できるライブラリ - AWS Lambda
まとめ
- InSpecをAWS Lambda上で動かしてみました
- Lambdaで実行するとどのような場合で有用かなと考えましたが、、思い浮かびませんでした
- 運用中の複数のクラウドにまたがったシステムに対するテストとかかな・・
以上です。