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を使って、「Hello Hands on world!」を出力するLambda関数を追加
検索窓に「Cloud9」を入力し、Cloud9を読み出す。
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しておく
AWSドキュメントでSAMを調べる
前の項の「 Lambda用のS3バケットを作成する 」の設定内容も下記のような方法で調べた。
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バケットの場所に置き換わってるのが分かる。
(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
})
}
テストを実施。「コロナ第6波が来て、緊急事態宣言がまたでるかも」が翻訳された。
Lambda関数の「設定」タブからリソースの概要で、「Amazon Translate」が利用可能であることが分かる。
これで、SAMを使って、翻訳APIを環境構築できるようになりました。
今回は、その2-SAMでTranslate機能をLambda関数として追加して、IAMも許可しました。
次回は、その3-API Gateway を構成に追加後、DynamoDBにログを書き込むようにLambda関数を連携させます 。