|
AWSメモ > AWS Lambdaで環境変数を使用する †
Lambda関数の作成 †index.py # coding: utf-8
import os
def handler(event, context):
env1 = os.environ.get('SampleEnv1', 'blank!')
env2 = os.environ.get('SampleEnv2', 'blank!')
return f'SampleEnv1 is {env1}. SampleEnv2 is {env2}.'
template.yml の作成 †ここではAWS::Serverless変換 を使用して作成する事とする。またデプロイは package & deploy の手順で行う為、codeUri は指定しない。 template.yml 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: "Get Environment Lambda Sample"
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: "*"
デプロイ 及び Lambda実行用のシェル作成 †parameter-overrides を使用して環境変数を上書きしてデプロイできるようなシェルを作成しておく。 make.sh #!/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 "Argument Error!!"
echo -e "\nUsage)"
echo -e " ./make.sh (deploy|execute)\n"
exit 1
esac
デプロイ & 実行 †./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
パラメータを変えてデプロイ & 実行 †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
|