AWS Lambda Custom RuntimesでAWS CLIを動かした。#reinvent

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。

こちらはAWS Lambda Custom Runtimes芸人 Advent Calendar 2018の23日目の記事です。

常にS3 バケットを同期し続けるという要件があり、cronでS3 syncを実行し続けるEC2を構築しようとしたのですが、 スケールや冗長性やログ等をEC2でゼロから構築しようとすると割と骨と心が折れます、というか折れました。 re:inventで発表されたカスタムランタイムを用いたらLambda上でこれ展開できるし、Lambdaのログの恩恵にあやかったほうが楽じゃないかと思って試したのがこのエントリです。
動かすことができたので、早速その知見を共有したいと思います。

リポジトリを作りました。

awscli-lambda-layer

こちらをcloneしてREADMEに従って進めて、AWS CLIのLayerとそれを含んだBashのカスタムランタイム環境が立ち上がることになります。

デプロイしてみる

gitで上記のリポジトリからclone済み・必要なソフトウェアは導入済みという前提で進めます。

  1. AWS CLIのLayerで必要なコンポーネント郡を取得する
    ./shell/01.build_deploy.sh [Role] [S3 Bucket] [AWS CLI Profile]
    

    DockerでAmazon Linuxを立ち上げてやるのが王道な気もするのですが、 今回の例では、一度Lambdaを立ち上げてしまって、そちらで取得したものをS3に配置するといったことを行っています。

  2. 必要なコンポーネント郡をLambda環境で動く形に変更し、Layerとしてアップロードする S3に上げたコンポーネント郡の配置を変更しLambda環境で動く用に配置していきます。 bin配下にAWS CLIの実行ファイルを配置し、その下に必要なライブラリを配置していくことになります。

    ./shell/02.create_aws_layer.sh [S3 Bucket] [AWS CLI Profile]
    
  3. AWS CLIのLayerを含んだLambda Functionをデプロイする

    include-aws-cliというフォルダに入っているfunction.shの中の関数がLambda 関数として実行されます。 必要に応じて書き換えることで、AWS CLIをLambdaから実行できます。

    ./shell/03.deploy_lambda.sh [LambdaFunctionName] [Role] [AWS CLI Profile]
    
  4. コンポーネント取得で用いたLambdaは不要なので削除する
    ./shell/04.delete_layer_creater.sh [AWS CLI Profile]
    
  5. Lambda Functionの更新を実施する (オプション)
    ./shell/05.update_lambda_function.sh [LambdaFunctionName] [AWS CLI Profile]
    

まとめ

AWS CLIをちょっと実行させるだけだったらこれらを用いることでEC2が不要になるケースもあるのではないかと思います。 自分はS3 syncの定期実行に早速こちらを用いたいと思います。

実行結果

デプロイしたLambdaを実行したCloudwatch logを添付します。

AWS CLIでバージョン情報を取得していることがわかるかと思います。

参考

[検証]LambdaのLayer機能を早速試してみた #reinvent

AWS LambdaにLayerなるものが追加されたのでPythonで簡単に使ってみる #reinvent