SAMを使ってテンプレートからサーバーレスな環境を構築する(その②-SAMでLambda関数-Translate機能追加とIAMも許可)

AWSのホームページの初心者ハンズオンにある「SAMを使ってテンプレートからサーバーレスな環境を構築する 」の内容を自分のAWSアカウントでやってみました。

ハンズオンではAWSホームページで、10本の Youtube-video でもって、翻訳 Web API を AWS Serverless Application Model (AWS SAM) を用いてテンプレートからシステムを構築します。
( 翻訳 Web API はハンズオンシリーズの前回取り扱い分 )

  • SAMの概説とCloud9を使った準備作業
  • 小手調べでSAMを使って、「Hello Hands on world!」Lambdaを作った後、SAMでTranslate機能をLambda関数として追加して、IAMも許可する
  • API Gateway を構成に追加後、DynamoDBにログを書き込むようにLambda関数を連携させる
  • SAM CLIも使ってみる。最後にリソースを削除する。

今回の投稿は2パート目で、小手調べでSAMを使って、「Hello Hands on world!」Lambdaを作った後、SAMでTranslate機能をLambda関数として追加して、IAMも許可します。

以下の感じです。

SAMでTranslate機能をLambda関数として追加して、IAMも許可する

(小手調べ)SAMを使って、「Hello Hands on world!」を出力するLambda関数を追加

検索窓に「Cloud9」を入力し、Cloud9を読み出す。

「OPEN IDE」で展開する
画面下部のターミナルからコマンド入力することができる。

Lambda用のS3バケットを作成する

S3バケット(「mikolabo-lambda」とした)を生成し、「translate-function.py」と「template.yaml」を配置

実行内容イメージ(設定ファイル、コマンド実行結果は以下を参照)
aws --version

aws s3 mb s3://*your-backet-name*

mkdir hands-on-serverless-2
cd hands-on-serverless-2
mkdir translate-function
touch translate-function/translate-function.py
touch template.yaml
import json
import logging

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

def lambda_handler(event, context):

    logger.info(event)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello Hands on world!')
    }
AWSTemplateFormatVersion: '2010-09-09'                     → CloudFormation と同じ書き方
Transform: AWS::Serverless-2016-10-31                     →
Description: AWS Hands-on for Beginners - Serverless 2   →
Resources:                                                 (SAMでの設定内容)
  TranslateLambda:
    Type: AWS::Serverless::Function                        (リソースは、Serverless function)
    Properties:
      FunctionName: translate-function-2
      CodeUri: ./translate-function             (CodeUri はパッケージコマンドでS3バケットの場所に変換される)
      Handler: translate-function.lambda_handler      (必須項目)
      Runtime: python3.7                   (必須項目)
      Timeout: 5
      MemorySize: 256

「template.yaml」と「translate-function.py」はSAVEしておく

S3にパケットが出来ている

AWSドキュメントでSAMを調べる

前の項の「 Lambda用のS3バケットを作成する 」の設定内容も下記のような方法で調べた。

AWSホームページから「AWS Serverless Application Repository」をクリック

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-specification-resources-and-properties.html

SAMを使う時に、このドキュメントを見ながら設定する。

template.yaml で使う「AWS::Serverless::Function」については、こちらで調べる。

パッケージング & デプロイ

パッケージング & デプロイ
aws cloudformation package \
     --template-file template.yaml \
     --s3-bucket mikolabo-lambda \
     --output-template-file packaged-template.yaml
aws cloudformation deploy \
     --template-file ./packaged-template.yaml \
     --stack-name mikolabo-serverless \
     --capabilities CAPABILITY_IAM

template.yamlから
packaged-template.yamlに変換するときに
CodeUriがS3バケットの場所に置き換わってるのが分かる。

「mikolabo-lambda」の中を確認
packaged-template.yamlの通りにオブジェクトが出来ている。

(Lambda関数を確認)

(translate-function は前回ハンズオン内容)

translate-function-2 が出来ている。

テストイベントに「Test2」と名前を付けて、「テスト」を実行

テスト結果を確認

SAMを使って、Translate機能をLambda関数として追加 する

実行内容イメージ(設定ファイル、コマンド実行結果は以下を参照)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS Hands-on for Beginners - Serverless 2
Resources:
  TranslateLambda:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: translate-function-2
      CodeUri: ./translate-function
      Handler: translate-function.lambda_handler
      Runtime: python3.9
      Timeout: 5
      MemorySize: 256
      Policies:
        - TranslateFullAccess

Python3.7 にしたら、初期設定に合わなくてエラーになったので、3.9 にした。
IAMポリシー「TranslateFullAccess」を追加

import json
import boto3

translate = boto3.client('translate')

def lambda_handler(event, context):

    input_text = "*Input Something*"

    response = translate.translate_text(
        Text=input_text,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )

    output_text = response.get('TranslatedText')

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text
        })
    }
Lambda関数を表示。コードは変更されている。
テストを実施

テストを実施。「コロナ第6波が来て、緊急事態宣言がまたでるかも」が翻訳された。

Lambda関数の「設定」タブからリソースの概要で、「Amazon Translate」が利用可能であることが分かる。

これで、SAMを使って、翻訳APIを環境構築できるようになりました。
今回は、その2-SAMでTranslate機能をLambda関数として追加して、IAMも許可しました。
次回は、その3-API Gateway を構成に追加後、DynamoDBにログを書き込むようにLambda関数を連携させます