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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

今回 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を使う上で気にしなくていい部分でしょうけど、
うち個人で気になったことを色々とまとめて見ました。