[Lambda] 最新版のSDK(Boto3)をLambda関数で利用してみた

AmazonLambda

はじめに

AWSチームのすずきです。

AWS Lambda では、Python 向けの AWS SDK (Boto 3) をデフォルトで利用する事が可能ですが、 リリース直後のAWSの新機能を利用する際、最新バージョンのSDKが必要となる場合があります。

今回、最新版のBoto3をデプロイパッケージに含めたLambda関数を作成し、その動作を確認する機会がありましたので、紹介させて頂きます。

実行環境

  • OS: Amazon Linux AMI release 2016.09
  • IAMロール : Adminロール相当を割当済
  • パッケージ: 「jq」導入済
  • AWSリージョン: us-west-2 (oregon)を利用

手順

boto3 インストール

  • 作業ディレクトリを作成し、インストール先を指定してboto3をインストールします
  • virtualenvは利用しませんでした。
WORKDIR=~/test-boto3
mkdir -p ${WORKDIR}
pip install boto3 -t  ${WORKDIR}

サンプルコード設置

  • 作業ディレクトリにテストコードを設置します
  • ALB対応のWAF(waf-regional)、変更用のトークンを取得するサンプルを用意しました
tee ${WORKDIR}/test-boto3.py <<EOF 
import boto3
def lambda_handler(event, context):
   client = boto3.client('waf-regional', region_name='ap-northeast-1')
   r = client.get_change_token()
   print(r)
EOF

デプロイパッケージ作成

  • boto3, サンプルコードを含む作業ディレクトリ直下をそのままパッケージ化します
cd ${WORKDIR}
zip -r ~/test-boto3.zip .

Lambda用ロール設置

  • Lambda関数に付与する、WAFの操作権限をもつロールを作成します
  • ロール名は「lambda-waf-fullaccess」としています
aws iam create-role --role-name lambda-waf-fullaccess \
 --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Action":"sts:AssumeRole","Principal":{"Service":"lambda.amazonaws.com"},"Effect":"Allow","Sid":""}]}'

aws iam attach-role-policy \
 --role-name lambda-waf-fullaccess \
 --policy-arn arn:aws:iam::aws:policy/AWSWAFFullAccess

Lambda関数作成

  • 作成したデプロイパッケージ、Lambda用ロールを指定して、Lambda関数を作成します。
AWSAccount=`aws sts get-caller-identity | jq -r .Account`
LambdaRoleARN="arn:aws:iam::${AWSAccount}:role/lambda-waf-fullaccess"

aws lambda create-function \
--region us-west-2 \
--function-name test-boto3 \
--zip-file fileb://~/test-boto3.zip  \
--role ${LambdaRoleARN} \
--handler test-boto3.lambda_handler \
--runtime python2.7 \
--timeout 10 \
--memory-size 128

動作確認

  • Lambdaの実行ログ、Tail指定で取得し、デコードした結果を確認
aws lambda invoke \
  --invocation-type RequestResponse \
  --function-name test-boto3 \
  --region us-west-2 \
  --log-type Tail /tmp/tmp.txt \
 | jq -r .LogResult | base64 -d

  • 出力結果
START RequestId: 845cfac9-c437-11e6-b237-xxxxxxxxxxxx Version: $LATEST
{u'ChangeToken': u'c3ba717d-d5a0-4ad1-b1d8-xxxxxxxxxxxx', 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '852ef067-c437-11e6-bcfb-xxxxxxxxxxxx', 'HTTPHeaders': {'x-amzn-requestid': '852ef067-c437-11e6-bcfb-xxxxxxxxxxxx', 'date': 'Sat, 17 Dec 2016 09:02:21 GMT', 'content-length': '54', 'content-type': 'application/x-amz-json-1.1'}}}
END RequestId: 845cfac9-c437-11e6-b237-xxxxxxxxxxxx
REPORT RequestId: 845cfac9-c437-11e6-b237-xxxxxxxxxxxx  Duration: 1054.04 ms    Billed Duration: 1100 ms    Memory Size: 128 MB Max Memory Used: 27 MB

まとめ

デプロイパッケージにAWS SDK(boto3)を組み込む事で、Lambda関数のコードサイズは5MBほど増量。僅かですが実行時間も増加する傾向が確認されました。

デフォルトで組み込まれているSDKが更新されるまでの暫定処置、ワークアラウンドとしてご利用ください。

参考

  • 2016/12/17時点、Lambdaデフォルトで利用出来るSDK(boto3)は「waf-regional」に非対応でした。

手順

cd ${WORKDIR}
zip -r ~/test-without-boto3.zip test-boto3.py

aws lambda create-function \
--region us-west-2 \
--function-name test-without-boto3 \
--zip-file fileb://~/test-without-boto3.zip  \
--role ${LambdaRoleARN} \
--handler test-boto3.lambda_handler \
--runtime python2.7 \
--timeout 10 \
--memory-size 128

aws lambda invoke \
  --invocation-type RequestResponse \
  --function-name test-without-boto3 \
  --region us-west-2 \
  --log-type Tail /tmp/tmp.txt \
 | jq -r .LogResult | base64 -d

結果

  • エラー抜粋
UnknownServiceError: Unknown service: 'waf-regional'. Valid service names are: acm, apigateway, application-autoscaling, appstream, autoscaling, budgets, cloudformation, cloudfront, cloudhsm, cloudsearch, cloudsearchdomain, cloudtrail, cloudwatch, codebuild, codecommit, codedeploy, codepipeline, cognito-identity, cognito-idp, cognito-sync, config, datapipeline, devicefarm, directconnect, discovery, dms, ds, dynamodb, dynamodbstreams, ec2, ecr, ecs, efs, elasticache, elasticbeanstalk, elastictranscoder, elb, elbv2, emr, es, events, firehose, gamelift, glacier, health, iam, importexport, inspector, iot, iot-data, kinesis, kinesisanalytics, kms, lambda, lightsail, logs, machinelearning, marketplacecommerceanalytics, meteringmarketplace, opsworks, opsworkscm, pinpoint, polly, rds, redshift, rekognition, route53, route53domains, s3, sdb, servicecatalog, ses, shield, sms, snowball, sns, sqs, ssm, stepfunctions, storagegateway, sts, support, swf, waf, workspaces, xray