1.2. Lambda関数の作成 (budgets-monitor)¶
作業の目的 [why]¶
Lambda関数"budgets-monitor"を作成します。
完了条件/事前条件 [設計者用情報]
完了条件 [after]
主処理は、以下を満たしたときに成功したものとします。
- 完了条件1
- Lambda関数"budgets-monitor"が存在する。
事前条件 [before]
主処理の実施は、以下の状態であることを前提とします。
- 事前条件1
- Lambda関数"budgets-monitor"が存在しない。
- 事前条件2
- IAMロール"handson-cli-lambda-role"が存在する。
- 事前条件3
- 関数コードファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。
- 事前条件4
- Lambda関数"budgets-monitor"のソースコードファイル"${HOME}/tmp/conf-handson-cli/budgets-monitor.py"が存在する。
作業対象 [what]¶
- Lambdaサービス
標準時間(合計)¶
8分
パラメータ設定¶
パラメータ設定の標準時間: | 2分 |
---|
作業に必要なモノ・情報 [resource]¶
作業開始には、以下が全て揃っていることが必要です。
リソース1: 関数コードファイル用ディレクトリ
Lambda関数コードを配置したディレクトリ"${HOME}/tmp/conf-handson-cli"です。
リソース2: Lambdaファンクション名
- 作成するLambdaファンクションの名称です。
- 今回は"budgets-monitor"とします。
リソース3: Lambdaファンクションの説明
- 作成するLambdaファンクションの説明です。
- 今回は"function for handson-cli"とします。
リソース4: Lambdaファンクションのランタイム名
- 作成するLambdaファンクションが利用するランタイムです。
- 今回は"python3.6"とします。
リソース5: IAMロール名
- 作成するLambdaファンクションが利用するIAMロールの名称です。
- 今回は"handson-cli-lambda-role"とします。
リソース6: Lambdaファンクション用ソースコードファイル
- 作成するLambdaファンクションが利用するソースコードのファイル名です。
- 今回は"${HOME}/tmp/conf-handson-cli/budgets-monitor.py"とします。
パラメータの指定¶
作業に必要なパラメータを変数に格納をします。
0.3. Lambdaファンクションの説明の指定¶
作成するLambdaファンクションの説明を指定します。
変数の設定:
LAMBDA_FUNCTION_DESC='function for handson-cli'
0.5. IAMロール名の指定¶
作成するLambdaファンクションが利用するIAMロールの名称を指定します。
変数の設定:
IAM_ROLE_NAME='handson-cli-lambda-role'
0.6. Lambdaファンクション用ソースコードファイル名の指定¶
作成するLambdaファンクションが利用するソースコードのファイル名を指定します。
変数の設定:
FILE_LAMBDA_CODE="${DIR_LAMBDA_CODE}/${LAMBDA_FUNCTION_NAME}.py" \ && echo ${FILE_LAMBDA_CODE}
結果(例):
${HOME}/tmp/conf-handson-cli/budgets-monitor.py
パラメータの保存¶
設定されている変数の保存先となるファイル名を指定します。
変数の設定:
DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli" FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-lambda-function-create.env" \ && echo ${FILE_PARAMETER}
結果(例):
${HOME}/tmp/parameter-handson-cli/2019-04-30-lambda-function-create.env
各変数に正しいパラメータ値が格納されていることを確認しながら保存します。
変数の確認:
cat << EOF > ${FILE_PARAMETER} # 0.0. AWS_DEFAULT_REGION:"<リージョン名>" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 0.1. DIR_LAMBDA_CODE:"${HOME}/tmp/conf-handson-cli" DIR_LAMBDA_CODE="${DIR_LAMBDA_CODE}" # 0.2. LAMBDA_FUNCTION_NAME:"budgets-monitor" LAMBDA_FUNCTION_NAME="${LAMBDA_FUNCTION_NAME}" # 0.3. LAMBDA_FUNCTION_DESC:"function for handson-cli" LAMBDA_FUNCTION_DESC="${LAMBDA_FUNCTION_DESC}" # 0.4. LAMBDA_RUNTIME:"python3.6" LAMBDA_RUNTIME="${LAMBDA_RUNTIME}" # 0.5. IAM_ROLE_NAME:"handson-cli-lambda-role" IAM_ROLE_NAME="${IAM_ROLE_NAME}" # 0.6. FILE_LAMBDA_CODE:"${HOME}/tmp/conf-handson-cli/budgets-monitor.py" FILE_LAMBDA_CODE="${FILE_LAMBDA_CODE}" EOF cat ${FILE_PARAMETER}
下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。
タスクの実施¶
課題
(未検証)
タスク標準時間: | 6分 |
---|
1. 前処理¶
1.1. 処理対象の状態確認¶
主処理の実施は、以下の状態であることを前提とします。
前提と異なることが判明した場合、直ちに処理を中止します。
事前条件1: Lambda関数"budgets-monitor"が存在しない。
「Lambda関数"budgets-monitor"が存在しない。」ことを確認します。
コマンド:
aws lambda list-functions \ --query "Functions[?FunctionName == \`${LAMBDA_FUNCTION_NAME}\`].FunctionName" \ --output text
結果(例):
(出力なし)
事前条件2: IAMロール"handson-cli-lambda-role"が存在する。
「IAMロール"handson-cli-lambda-role"が存在する。」ことを確認します。
コマンド:
aws iam list-roles \ --query "Roles[?RoleName == \`${IAM_ROLE_NAME}\`].RoleName" \ --output text
結果(例):
handson-cli-lambda-role
事前条件3: 関数コードファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。
「関数コードファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。」ことを確認します。
コマンド:
ls -d ${DIR_LAMBDA_CODE}
結果(例):
${HOME}/tmp/conf-handson-cli
事前条件4: Lambda関数"budgets-monitor"のソースコードファイル"${HOME}/tmp/conf-handson-cli/budgets-monitor.py"が存在する。
「Lambda関数"budgets-monitor"のソースコードファイル"${HOME}/tmp/conf-handson-cli/budgets-monitor.py"が存在する。」ことを確認します。
コマンド:
ls ${FILE_LAMBDA_CODE}
結果(例):
${HOME}/tmp/conf-handson-cli/budgets-monitor.py
1.2. 主処理に必要な情報の取得¶
IAMロールのARN取得
コマンド:
IAM_ROLE_ARN=$( \ aws iam get-role \ --role-name ${IAM_ROLE_NAME} \ --query 'Role.Arn' \ --output text \ ) \ && echo ${IAM_ROLE_ARN}
結果(例):
arn:aws:iam::XXXXXXXXXXXX:role/handson-cli-lambda-role
ZIPファイルの作成
変数の設定:
FILE_LAMBDA_ZIP="${DIR_LAMBDA_CODE}/${LAMBDA_FUNCTION_NAME}.zip" \ && echo ${FILE_LAMBDA_ZIP}
結果(例):
${HOME}/tmp/conf-handson-cli/budgets-monitor.zip
コマンド:
zip -j ${FILE_LAMBDA_ZIP} ${FILE_LAMBDA_CODE}
結果(例):
adding: ${HOME}/tmp/conf-handson-cli/budgets-monitor.py (deflated 43%)
ハンドラ名の指定
変数の設定:
LAMBDA_HANDLER="${LAMBDA_FUNCTION_NAME}.lambda_handler" \ && echo ${LAMBDA_HANDLER}
結果(例):
budgets-monitor.lambda_handler
2. 主処理¶
Lambdaファンクションの作成¶
変数の確認:
cat << ETX # LAMBDA_FUNCTION_NAME:"budgets-monitor" LAMBDA_FUNCTION_NAME="${LAMBDA_FUNCTION_NAME}" # LAMBDA_FUNCTION_DESC:"function for handson-cli" LAMBDA_FUNCTION_DESC="${LAMBDA_FUNCTION_DESC}" # LAMBDA_RUNTIME:"python3.6" LAMBDA_RUNTIME="${LAMBDA_RUNTIME}" # LAMBDA_HANDLER:"budgets-monitor.lambda_handler" LAMBDA_HANDLER="${LAMBDA_HANDLER}" # IAM_ROLE_ARN:"arn:aws:iam::XXXXXXXXXXXX:role/handson-cli-lambda-role" IAM_ROLE_ARN="${IAM_ROLE_ARN}" # FILE_LAMBDA_ZIP:"${HOME}/tmp/conf-handson-cli/budgets-monitor.zip" FILE_LAMBDA_ZIP="${FILE_LAMBDA_ZIP}" ETX
コマンド:
aws lambda create-function \ --function-name ${LAMBDA_FUNCTION_NAME} \ --description "${LAMBDA_FUNCTION_DESC}" \ --runtime ${LAMBDA_RUNTIME} \ --role ${IAM_ROLE_ARN} \ --handler ${LAMBDA_HANDLER} \ --zip-file fileb://${FILE_LAMBDA_ZIP}
結果(例):
{ "CodeSha256": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=", "FunctionName": "budgets-monitor", "CodeSize": 866, "MemorySize": 128, "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:budgets-monitor", "Version": "$LATEST", "Role": "arn:aws:iam::XXXXXXXXXXXX:role/handson-cli-lambda-role", "Timeout": 3, "LastModified": "2019-04-30T01:23:45.678+0000", "Handler": "budgets-monitor.lambda_handler", "Runtime": "python3.6", "Description": "function for handson-cli" }