AWS LambdaのPython版で何が出来るか色々検証してみた

2015.10.13

サーモン大好き、横山です。

今回 AWS Lambda のPython対応で何が出来るのか色々と気になったので、検証してみました。

以下の内容は、(2015/10/13現在の情報です)

CPUは?

Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz の 2コアの環境で動いてるらしいです。

プログラム

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
print _('cat /proc/cpuinfo | grep -e processor -e Xeon')

実行結果

lambda_iroiro_01_cpu

メモリは?

4GB のメモリで動いてるらしいです。

プログラム

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
print _('cat /proc/meminfo | grep MemTotal')

実行結果

lambda_iroiro_02_memory

環境変数は?

AWS_* の環境変数だけ設定されています。PATHはsbin含まれていないので、そっち方面のコマンド叩く際はフルパスで入力する必要ですね。

プログラム

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
print _('ENV')

実行結果

lambda_iroiro_09_env

OSは?

OSは Amazon Linux AMI 2015.03 で動いてるみたいです。

プログラム

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
print _('cat /etc/os-release')

実行結果

lambda_iroiro_08_os_release

実行ファイルは?

Edit code inline で実行していると /var/task/lambda_function.py で実行されていて、外部から呼ばれているらしいです。

プログラム

def lambda_handler(event, context):
print __file__
print __name__

実行結果

lambda_iroiro_03_exec

実行してるユーザは?

ec2-user じゃないんですね。 sbx_userXXXX のユーザで実行しているらしいです。 うちが実行確認している感じでは、同じLambda functionでは、ユーザは変わらなかったです。

プログラム

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
print _('id')

実行結果

lambda_iroiro_04_id

sbx_userXXXX はいくつある?

100ユーザほどいます。番号は 1051-1150 の連番で存在します。 他のインスタンスがどうなっているかはわかりません。

余談ですが、Log output出来るのが最大 4094バイト ってのがわかりました。 4094バイトより多い出力があると、先頭の出力が削られ、末尾の出力だけLog outputに出ます。

プログラム

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
filename = '/rgp/cnffjq'.encode('rot13')
print ', '.join(_('cat %s | grep sbx_user | cut -d: -f1' % filename).split('\n'))
print _('cat %s | grep sbx_user | wc -l' % filename)

実行結果

lambda_iroiro_05_sbx_user_count

ファイルは作成可能か

実行ファイルと同じ場所には作成出来ません。 /tmp/ にはファイルを作成出来ますが、実行後消されるので保持目的では使用しない方がいいですね。

プログラム

カレントディレクトリ

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
print _('echo "classmethod" >> ./file')
print '='*10
print _('ls -l ./')
print '='*10
print _('ls -l ../ | grep task')

/tmp ディレクトリ

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
print _('echo "classmethod" >> /tmp/file')
print '='*10
print _('ls -l / | grep tmp')
print '='*10
print _('ls -l /tmp')

実行結果

カレントディレクトリ

lambda_iroiro_06_touch_current

/tmp ディレクトリ

lambda_iroiro_07_touch_tmp

インスタンスメタデータが取れるか?

取れませんでした。

プログラム

import commands

def _(cmd):
return commands.getoutput(cmd)

def lambda_handler(event, context):
print _('/usr/bin/curl http://169.254.169.254/latest/meta-data/public-ipv4')
print _('/usr/bin/curl http://169.254.169.254/latest/meta-data/instance-id')

実行結果

lambda_iroiro_07_instance_meta_data

まとめ

AWS Lambdaを使う上で気にしなくていい部分でしょうけど、 うち個人で気になったことを色々とまとめて見ました。