スケジュール機能の登場や最大稼働可能時間の延長で、バッチ的なタスクで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 パターン別構築・運用ガイド 一番大切な知識と技術が身につく
- 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/03/25
- メディア: Kindle版
- この商品を含むブログを見る
See Also:
サーバレスアーキテクチャとは?
サーバレスアーキテクチャ(ServerLess Architecture)とBaaSの違い
仮想サーバ、コンテナサービス、ファンクション
クラウドファーストとクラウドネイティブ
AWS Mobile HubとAmazon API Gatewayからモバイル開発の今後を考える
JAWSUG千葉で、API Gatewayの話をしてきました。
5分で何となく解るAmazon Cognito