#author("2019-02-11T11:40:17+00:00","","") [[AWSメモ]] > * AWS Lambdaで環境変数を使用する [#ua8b5cea] #setlinebreak(on); #contents -- 関連 --- [[AWS API Gateway&LambdaをSwaggerで定義する]] --- [[AWS LambdaからDynamoDBに接続する]] --- [[AWS LambdaからRDSに接続する]] --- [[AWS LambdaからLambdaを呼ぶ]] --- [[AWS Lambdaでデフォルトで利用できるライブラリ]] --- [[AWS LambdaからLambda関数を作成する]] --- [[AWS LambdaからS3へのアップロードとダウンロード]] --- [[AWS Lambda Layerで共通処理を作成する]] -- 参考 --- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/env_variables.html ** Lambda関数の作成 [#xda375d3] #html(<div style="padding-left: 10px;">) index.py #mycode2(){{ # coding: utf-8 import os def handler(event, context): env1 = os.environ.get('SampleEnv1') if os.environ.get('SampleEnv1') else 'blank!' env2 = os.environ.get('SampleEnv2') if os.environ.get('SampleEnv2') else 'blank!' return f'SampleEnv1 is {env1}. SampleEnv2 is {env2}.' }} #html(</div>) ** template.yml の作成 [#r88a1df5] #html(<div style="padding-left: 10px;">) ここでは [[AWS::Serverless変換>https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html]] を使用して作成する事とする。またデプロイは package & deploy の手順で行う為、codeUri は指定しない。 ※ create-stack で一発作成する場合は s3への事前アップロード 及び template での codeUri の指定が必要。 template.yml #mycode2(){{ AWSTemplateFormatVersion : '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: "Sample Lambda Environments." Parameters: SampleEnv1: Type: String Default: "" SampleEnv2: Type: String Default: "" FuncName: Type: String Default: SampleLambdaEnv Resources: SampleLambdaEnv: Type: "AWS::Serverless::Function" Properties: FunctionName: !Ref FuncName Description: "Lamndaの環境変数取得サンプル" Environment: Variables: SampleEnv1: !Ref SampleEnv1 SampleEnv2: !Ref SampleEnv2 Handler: index.handler MemorySize: 128 Role: !GetAtt SampleLambdaEnvRole.Arn Runtime: python3.6 Timeout: 30 SampleLambdaEnvRole: Type: AWS::IAM::Role Properties: RoleName: SampleLambdaEnvRole AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole" Policies: - PolicyName: LambdaEnvPolicy PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - "logs:*" Resource: "*" }} #html(</div>) ** デプロイ 及び Lambda実行用のシェル作成 [#s59e7618] #html(<div style="padding-left: 10px;">) parameter-overrides を使用して環境変数を上書きしてデプロイできるようなシェルを作成しておく。 make.sh #mycode2(){{ #!/bin/bash # AWSアカウントID ACCOUNT_ID=`aws sts get-caller-identity | grep Account | awk '{print $2}' | sed -e "s/[^0-9]//g"` # バケット名(世界で唯一である必要がある為、末尾にアカウントID等を付与しておく) S3_BUCKET=my-cloudformation-templates-${ACCOUNT_ID} # スタック名 STACK_NAME=SampleEnvFunctionStack # Lambda関数名 FUNC_NAME=SampleLambdaEnv # デプロイ deploy(){ # アップロード用のS3バケットの作成 bucket_count=`aws s3api list-buckets | grep my-cloudformation-templates-675008719274 | wc -l | awk '{print $1}'` if [ "$bucket_count" == "0" ]; then aws s3api create-bucket --create-bucket-configuration '{"LocationConstraint": "ap-northeast-1"}' --bucket $S3_BUCKET fi # 検証&パッケージング&デプロイ aws cloudformation validate-template --template-body file://template.yml \ && aws cloudformation package --template-file template.yml --s3-bucket $S3_BUCKET --output-template-file packaged-template.yml \ && aws cloudformation deploy --template-file packaged-template.yml --stack-name $STACK_NAME \ --parameter-overrides FuncName=$FUNC_NAME SampleEnv1="${SAMPLE_ENV1}" SampleEnv2="${SAMPLE_ENV2}" \ --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND # エラー時はスタック作成時のイベントを表示 err_count=`aws cloudformation describe-stacks --stack-name $STACK_NAME | grep StackStatus | grep ROLLBACK_COMPLETE | wc -l | awk '{print $1}'` if [ "$err_count" != "0" ]; then aws cloudformation describe-stack-events --stack-name $STACK_NAME fi } # 実行 execute(){ aws lambda invoke --invocation-type RequestResponse --function-name $FUNC_NAME --region ap-northeast-1 --log-type Tail outputfile.txt echo "--- result ---" cat outputfile.txt echo -e "\n--------------" rm -rf outputfile.txt } # デプロイ or 実行 case $1 in deploy) deploy ;; execute) execute ;; *) echo "./make.sh deploy|execute" exit 1 esac }} #html(</div>) ** デプロイ & 実行 [#ecacca4f] #myterm2(){{ ./make.sh deploy && ./make.sh execute { "Description": "Sample Lambda Environments.", "Parameters": [ { "DefaultValue": "", "NoEcho": false, "ParameterKey": "SampleEnv2" }, { "DefaultValue": "", "NoEcho": false, "ParameterKey": "SampleEnv1" }, { "DefaultValue": "SampleLambdaEnv", "NoEcho": false, "ParameterKey": "FuncName" } ] } Uploading to 618582a63c2f8.... 3243 / 3243.0 (100.00%) Successfully packaged artifacts and wrote output template to file packaged-template.yml. Execute the following command to deploy the packaged template aws cloudformation deploy --template-file /path_to/packaged-template.yml --stack-name <YOUR STACK NAME> Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - SampleEnvFunctionStack { "LogResult": "U1RBUlQgUmVxdWVzdElkOiBhZ......==", "ExecutedVersion": "$LATEST", "StatusCode": 200 } --- result --- "SampleEnv1 is blank!. SampleEnv2 is blank!." -------------- }} #html(</div>) ** パラメータを変えてデプロイ & 実行 [#na34dfbf] #myterm2(){{ export SAMPLE_ENV1=ABC export SAMPLE_ENV2=DEF ./make.sh deploy && ./make.sh execute { "Description": "Sample Lambda Environments.", "Parameters": [ { "DefaultValue": "", "NoEcho": false, "ParameterKey": "SampleEnv2" }, { "DefaultValue": "", "NoEcho": false, "ParameterKey": "SampleEnv1" }, { "DefaultValue": "SampleLambdaEnv", "NoEcho": false, "ParameterKey": "FuncName" } ] } Uploading to 618582a63c2f8.... 3243 / 3243.0 (100.00%) Successfully packaged artifacts and wrote output template to file packaged-template.yml. Execute the following command to deploy the packaged template aws cloudformation deploy --template-file /path_to/packaged-template.yml --stack-name <YOUR STACK NAME> Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - SampleEnvFunctionStack { "LogResult": "U1RBUlQgUmVxdWVzdElkOiBhZ......==", "ExecutedVersion": "$LATEST", "StatusCode": 200 } --- result --- "SampleEnv1 is ABC. SampleEnv2 is DEF." -------------- }} #html(</div>)