プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Lambda PythonでAWS CLIコマンドを実行する方法

f:id:dkfj:20151027075740p:plain

 スケジュール機能の登場や最大稼働可能時間の延長で、バッチ的なタスクでLambdaを使いたいという要望が増えてきています。このバッチを新規で作る場合は良いのですが、既にAWS CLIで作りこんでいるという場合も多いでしょう。そうなるとPythonやNode.jsに移植するより、そのまま使いたいはずです。しかし、2015年10月現在ではLambdaではAWS CLIはサポートされていません
 しかし、非公式ですがAWS CLIについても使おうと思えば使えます。チラッと手順を紹介するので、興味がある人は自己責任で試してください。

AWSの設定



 AWS絡みでは、下記の設定が必要です。特にCLI特有という訳ではないので、サラッと紹介だけしておきます。

  • Lambdaプロジェクトの作成
  • IAM Roleの作成
  • SNS関係の設定

 Lambdaのエンジンは、Pythonを選択します。理由としては、AWS CLIの実体はbotocoreでエンジンがPythonの場合はデフォルトでインストールされている為です。IAMは、CLIから呼ぶ出すAWSのリソースの使用権限を付与します。SNSについては、サンプルとして実行するCLIコマンドから呼び出す為です。何でも良いです。

Lambdaモジュールの作成



 まず必要なPythonのモジュールを用意します。2015年10月29日時点では、下記のモジュールが必要でした。Lambda関数を作成するローカル環境で、モジュールのダウンロードをしてください。

pip install awscli -t ./
pip install colorama -t ./ 
pip install pyasn1 -t ./
pip install rsa

 次にPythonの実行ソースを作成します。本当に適当に書いています。

import commands

print('Loading function')

def lambda_handler(event, context):
    result = commands.getoutput("/var/task/topic.sh")
    print(result)
    return 0

 ソースの意味としては、OSのコマンドを実行するライブラリを呼び出し、OSコマンドでシェルスクリプトを実行するだけです。呼び出す対象のシェルは、下記の通りです。CLIコマンドでSNS通知を発行しています。

#!/bin/bash

export AWS_DEFAULT_REGION='ap-northeast-1'

SNS_TOPIC_ARN='arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:PushNotificationTest'


SNS_MSG_SUBJECT='test message'
SNS_MSG_BODY='Hello World!'

aws sns publish \
    --topic-arn ${SNS_TOPIC_ARN} \
    --message "${SNS_MSG_BODY}" \
    --subject "${SNS_MSG_SUBJECT}"

 準備が出来れば、対象のソース・モジュールをzipに固めます。

$ zip -r exec-cli.zip lambda_function.py topic.sh aws* colorama* pyasn1* rsa* 

 Lambdaのコンソール画面からzipファイルをアップロードして実行してください。上手くいけば、メールが届いているはずです。

技術的な背景



 Lambdaファンクションが実行される環境としては、たぶんECSのようなコンテナで管理されたAmazon Linux AMIのインスタンスです。ということで、適切な権限のIAM Roleを割り当てれば、そこで実行されるコマンドについてもIAM Roleの権限が継承されているはずです。じゃぁ、後は必要なモジュールを配置すればいいやんという推測です。実際に動いているので、予想通りなのでしょう。

感想



 この様にLambdaの実行環境は、実はかなり自由度が高く頑張ればかなりのことが出来ます。一方で、AWSが保証している言語の実行エンジン以外の部分については、どのように変更されるか全く解りません。その為、実戦配備にはリスキー過ぎます。ユーザとしては、リスクを承知の上で利用するか、AWS側の対応を待つ以外ありません。私の個人的な思いとしては、AWSさん早くCLIを使えるようにしてください。

※書いた後に気がついたのですが、ファイル操作系の処理をLambdaに持って行ってもあまり用途はなさそうですね。誰かLambda+CLIで素敵なシェル芸を生み出してくださいw

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2015/03/25
  • メディア: Kindle版
  • この商品を含むブログを見る

See Also:
サーバレスアーキテクチャとは?
サーバレスアーキテクチャ(ServerLess Architecture)とBaaSの違い
仮想サーバ、コンテナサービス、ファンクション
クラウドファーストとクラウドネイティブ
AWS Mobile HubとAmazon API Gatewayからモバイル開発の今後を考える
JAWSUG千葉で、API Gatewayの話をしてきました。
5分で何となく解るAmazon Cognito