ハンズオン(簡易版): Lambda入門

1.1. Python関数コードファイルの作成 (handson-cli-lambda-sns-function)

目的

Lambda関数"handson-cli-lambda-sns-function"のソースコードファイルを作成します。

パラメータの指定

作業に必要なパラメータを変数に格納をします。

0. リージョンの指定

リージョンを指定します。

環境変数の設定

export AWS_DEFAULT_REGION='ap-northeast-1'

1. Python関数名

Python関数名を指定します。

変数の設定:

PYTHON_FUNCTION_NAME='lambda_handler'

2. Lambda関数コードファイル用ディレクトリ

Lambda関数コードファイル用ディレクトリを指定します。

変数の設定:

DIR_LAMBDA_CODE="${HOME}/environment/conf-handson-cli-lambda"

ディレクトリが存在することを確認します。

コマンド:

ls -d ${HOME}/environment/conf-handson-cli-lambda

結果(例:存在する場合):

${HOME}/environment/conf-handson-cli-lambda

存在しない場合は作成します。

コマンド:

mkdir -p ${HOME}/environment/conf-handson-cli-lambda

3. Lambda関数コードファイル名

Lambda関数コードファイル名を指定します。

変数の設定:

LAMBDA_CODE_NAME='handson-cli-lambda-sns-function.py'

変数の設定:

FILE_CODE_FUNCTION="${DIR_LAMBDA_CODE}/${LAMBDA_CODE_NAME}" \
  && echo ${FILE_CODE_FUNCTION}

結果(例):

${HOME}/environment/conf-handson-cli-lambda/handson-cli-lambda-sns-function.py

4. SNSトピック名

SNSトピック名を指定します。

変数の設定:

SNS_TOPIC_NAME='handson-cli-lambda-topic'

各変数に正しいパラメータ値が格納されていることを確認します。

変数の確認:

cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. PYTHON_FUNCTION_NAME:"lambda_handler"
       PYTHON_FUNCTION_NAME="${PYTHON_FUNCTION_NAME}"
  # 2. DIR_LAMBDA_CODE:"${HOME}/environment/conf-handson-cli-lambda"
       DIR_LAMBDA_CODE="${DIR_LAMBDA_CODE}"
  # 3. FILE_CODE_FUNCTION:"${HOME}/environment/conf-handson-cli-lambda/handson-cli-lambda-sns-function.py"
       FILE_CODE_FUNCTION="${FILE_CODE_FUNCTION}"
  # 4. SNS_TOPIC_NAME:"handson-cli-lambda-topic"
       SNS_TOPIC_NAME="${SNS_TOPIC_NAME}"

END

手順

SNSトピックのARNを取得します。

変数の設定:

SNS_TOPIC_ARN=$( \
  aws sns list-topics \
    --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
    --output text \
) \
  && echo ${SNS_TOPIC_ARN}

結果(例):

arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-lambda-topic

関数コードファイルの作成します。

変数の確認:

cat << ETX

  # FILE_CODE_FUNCTION:"${HOME}/environment/conf-handson-cli-lambda/handson-cli-lambda-sns-function.py"
    FILE_CODE_FUNCTION="${FILE_CODE_FUNCTION}"
  # SNS_TOPIC_ARN:"arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-lambda-topic"
    SNS_TOPIC_ARN="${SNS_TOPIC_ARN}"

ETX

コマンド:

cat << EOF > ${FILE_CODE_FUNCTION}
import os
import boto3
import logging

sns_client = boto3.client('sns')
topic_arn = '${SNS_TOPIC_ARN}'

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

def lambda_handler(event, context):

  logger.info('## ENVIRONMENT VARIABLES')
  logger.info(os.environ)
  logger.info('## EVENT')
  logger.info(event)

  # publush sns topic
  sns_message = event['detail']
  sns_subject = 'Hello {} {}!'.format(event['first_name'], 
                                      event['last_name'])

  request = {
    'TopicArn': topic_arn,
    'Message': sns_message,
    'Subject': sns_subject
  }
  try:
    response_sns = sns_client.publish(**request)
    logger.info('## REQUEST RESPONSE SNS')
    logger.info(response_sns)
  except Exception as e:
      return logger.error("Failed to publish SNS message: {}".format(e))

  return {
      "statusCode": 200,
      "sns": "Successfully publush SNS message."
  }
EOF

cat ${FILE_CODE_FUNCTION}

結果(例):

import os
import boto3
import logging


sns_client = boto3.client('sns')
topic_arn = 'arn:aws:sns:ap-northeast-1:358597497495:handson-cli-lambda-topic'

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

def lambda_handler(event, context):

  logger.info('## ENVIRONMENT VARIABLES')
  logger.info(os.environ)
  logger.info('## EVENT')
  logger.info(event)

  # publush sns topic
  sns_message = event['detail']
  sns_subject = 'Hello {} {}!'.format(event['first_name'],
                                      event['last_name'])

  request = {
    'TopicArn': topic_arn,
    'Message': sns_message,
    'Subject': sns_subject
  }
  try:
    response_sns = sns_client.publish(**request)
    logger.info('## REQUEST RESPONSE SNS')
    logger.info(response_sns)
  except Exception as e:
      return logger.error("Failed to publish SNS message: {}".format(e))

  return {
      "statusCode": 200,
      "sns": "Successfully publush SNS message."
  }

完了確認

「Lambda関数コードファイル"${HOME}/environment/conf-handson-cli-lambda/handson-cli-lambda-sns-function.py"が存在する。」ことを確認します。

コマンド:

ls ${FILE_CODE_FUNCTION}

結果(例):

${HOME}/environment/conf-handson-cli-lambda/handson-cli-lambda-sns-function.py