手を動かしながら学ぶサーバーレスハンズオンをやってみた
初めに
私が、AWSを学習したudemyの講座の講師をされていた
金澤さんのハンズオンだったので、凄く楽しみにしていたのですが、
ハンズオンに行けなかったため自己学習です。
本記事は、以下の勉強会で実施された内容です。
https://jawsug-bgnr.connpass.com/event/165065/
"サーバーレス"とは何か?何がうれしいのか?
開発者がやりたいこととやらなければいこと
サーバーレスでは、サーバの管理が不要なため、
開発者はユーザーに価値を届けることに集中できる!
サーバーレスアーキテクチャの特徴
- インフラのプロビジョニングや管理が不要
- ビルドインの高可用性
- 自動でスケール
- 価値に対する支払い
AWS Lamdbaで 日→英 翻訳します
シナリオ#1 日→英翻訳をすぐさまやりたい
- オリンピックのある今年は英語を使う機会も多い
- 英語の聞き取りは大丈夫、でも喋るのが。。
- でもいつその機会に遭遇するかはわからない
- コストは少しでも押さえたい
AWSにおけるComputeサービス
- EC2
- 自由度:高い
- 管理の手間:多い
- Lambda
- 自由度:低い
- 管理の手間:少ない
AWS Lambdaの特徴
- サーバーの
プロビジョニング/管理なし
で、プログラムを実行できるサービス - コードを実行するための準備、スケーリングなどは、Lambda側で実施
開発者の方はコードを書くことに集中
できる - 料金体系は
リクエストベース
- 実行回数 + 実行時間(単価は確保したメモリ量)
※無料枠あり
- 実行回数 + 実行時間(単価は確保したメモリ量)
ハンズオン
AWS Lambdaを用い、下記の2つの作業を進めていく
- Lambda Functionを作成し、"Hello World"と表示します
- Lambda Functionを修正し、Amazon Translateと連携します
Lambda Functionを作成し、"Hello World"と表示します
IAMユーザでログイン&初期設定
- 右上:
東京
リージョンを選択 - 画面左下の
English(US)
を日本語
に変更
- 右上:
AWS Lambda画面へ
- サービス検索窓にLambdaと入力し、下に出てくるLambdaをクリックします
Lambda Functionの作成
右上の橙色の
関数の作成
をクリックします一から作成
のままでOK関数の情報を入力し、右下の
関数の作成
をクリックします- 関数名:
translate-function
- ランタイム:
Python3.8
- 関数名:
少し下にスクロールするとソースコードが見えてくる
- 7行目の"Hello from Lambda!"の中身を何でも良いので
修正
します - 右上の
保存
ボタンをクリックします
Lambda Functionをテスト実行します
- 右上の
テスト
をクリックします - イベント名に
Test
と入力します - 右下の
作成
ボタンをクリックします - 右上の
テスト
ボタンをクリックします statusCode: 200,
が表示されれば成功です
- 右上の
Lambda Functionを修正し、Amazon Translateと連携します
- Lambda Function のIAMロールを修正します
- Lambda Function 画面の下の方にスクロールしてください
xxx ロール表示します
をクリックしますポリシーをアタッチします
をクリックします- 検索窓に
translate
と入力し、
TranslateFullAccess
の方にチェックを入れます - その後、右下の
ポリシーのアタッチ
をクリックします - Lambda画面に戻ります
- Lambda Functionのソースコードを修正
import json import boto3 def lambda_handler(event, context): translate = boto3.client('translate') input_text = '順調ですか?' 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 }) }
保存
>テスト
をクリックします- 翻訳結果が出ていればOKです
input_test の文字列を変更し、色々試してください
- 翻訳結果が出ていればOKです
翻訳 Web APIを作る
シナリオ#2 日→英 翻訳をWeb API化したい
- 翻訳したいときに常にマネージメントコンソールにログインできるとは限らない
- スマホからでもサクッと接続できるようにWeb API 化したい
- いつでも使えないと困るけど、冗長性のための設計はしている時間がない...
サーバーレスアーキテクチャでよく利用されるAWSサービス
- AWS Lambda
- Amazon API Gateway
- Amazon DynamoDB
- Amazon S3
- AWS Step Function
- Amazon SQS
- Amazon CloudWatch
- AWS X-Ray
Amazon API Gatewayの特徴
- サーバーのプロビジョニングや管理無しで、
APIを作成・管理
できるマネージドサービス - 可用性の担保、スケーリングなどのAPI管理で必要なことをAPI Gatewayに任せる事で、
開発者はビジネスの差別化につながる作業に集中
できます - 料金体系はリクエストベース(※REST APIの場合)
- 実行回数 + キャッシュメモリ + データ転送料金
ハンズオン
Amazon API GatewayとAWS lambdaを組み合わせて、外部から叩けるWeb APIを作って行きます。
import json import boto3 def lambda_handler(event, context): translate = boto3.client('translate') input_text = event['queryStringParameters']['input_text'] response = translate.translate_text( Text=input_text, SourceLanguageCode="ja", TargetLanguageCode="en" ) ...
-
アクション
>リソースの作成
をクリックします- "リソース名"を
translate
とし、リソースの作成
をクリックします
-
/translate
が選ばれている状態で、アクション
>メソッドの作成
をクリックします- "/translate"の下のプルダウンから、
GET
を選択し、チェックマーク
をクリックします Lambdaプロキシ統合の使用
をチェック
したのち、
"Lambda 関数"にtranslate-function
を指定し、保存をクリックします- "Lambda 関数に権限を追加する"ダイアログで、
OK
をクリックします
文字起こし + 翻訳パイプラインを作る
シナリオ#3 英文の文字起こしをしたい
- さっき聞き取りは問題ないといったけど、嘘でした...
- 喋ってもらった内容をテキスト化できないと辞書も引けない
- まず文字お越しするところだけでも自動化できないだろうか
Amazon Transcribeの特徴
- 音声をテキストにする文字お越しサービス
- 2019年11月に日本語対応
- 保存した音声ファイルやリアルタイム変換が可能 5
Amazon Simple Storage Service(Amazon S3)の特徴
高い耐久性
を持つオブジェクトストレージサービス99.999999999%
(イレブンナイン)- 標準で少なくとも3つのAZに格納されている
- 容量無制限、安価なストレージ
様々なAWSサービスと連携
- 例:ファイルが格納されたことをトリガーに非同期にLambda関数を呼ぶ
ハンズオン
AWS LambdaとAmazon Transcribeを組み合わせて、音声データを文字お越しするパイプラインを作ります
1.S3のバケットを作成する
- input用とoutput用に2つのS3バケットを作成します
-
サービス
>S3
と入力 >S3
を選択 -
バケットを作成する
をクリックします - バケット名を
yyymmdd-transcribe-input-yourname
とする6 リージョンは、lambdaと同じにしてください
2.Lambda Functionの作成
- AWS Lambdaの画面へ:
サービス
>lambda
と入力 >Lambda
を選択します -
関数の作成
をクリックします -
設計図の使用
> 検索窓にS3
と入力し、Enter
-
s3-get-object-python
を選択し、右下の設定
をクリックします - Function名:
transcribe-function
,
Role 名:transcribe-function-role
とし、下へ移動します - S3 トリガーの対象になる
input用のバケットを指定
します -
トリガーの有効化
にチェック
をつけます - 下部の
関数の作成
をクリックします - IAM ロールを修正する
Lambda Functionの下部からxxx ロールを表示
をクリックします -
ポリシーをアタッチします
をクリックします - 検索窓に
S3
と入力 >AmazonS3FullAccess
にチェックします - 検索窓をクリアし、
transcribe
と入力 >AmazonTranscribeFullAccess
にチェックします - ソースコードを以下のように修正し、
保存
するOutputBucketName
にはOutputバケット名を入力してください
import json import urllib.parse import boto3 import datetime s3 = boto3.client('s3') transcribe = boto3.client('transcribe') def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: transcribe.start_transcription_job( TranscriptionJobName= datetime.datetime.now().strftime("%Y%m%d%H%M%S") + '_Transcription', LanguageCode='en-US', Media={ 'MediaFileUri': 'https://s3.ap-northeast-1.amazonaws.com/' + bucket + '/' + key }, OutputBucketName='YYYYMMDD-transcribe-output-YourName' ) except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e
3.パイプラインのテストを実施する
- 音声ファイルは下記URL(Amazon Pollyのサンプル)から、ダウンロードします
S3にmp3ファイルをアップロードする
input側のS3バケットでアップロード
をクリックしますファイルを追加
から先ほどDLしたmp3ファイルを指定し、アップロード
しますサービス
>transcribe
と入力 >Amazon Trabscribe
を選択します左上の
ハンバーガーメニュー
をクリックし >Transcription Jobs
をクリックしますJob Statusが
In progress
であることを確認し、Complete
になるまで待ちますJobが完了したら、Output側のS3を確認します
yyyymmddhhmmss_Transcription.jsonファイルがあれば成功です- Jsonファイルの中の resulte > transcripts > transcriptを確認します
“transcript”: “Hello. Do you speak a foreign language? One language is never enough.”と文字起こしされていると思います。{"jobName":"20200220074630_Transcription","accountId":"XXXXXXXXXXXX","results":{"transcripts":[{"transcript":"Hello. Do you speak a foreign language? One language is never enough."}],"items":[{"start_time":"0.04","end_time":"0.65","alternatives":[{"confidence":"0.9139","content":"Hello"}],"type":"pronunciation"},{"alternatives":[{"confidence":"0.0","content":"."}],"type":"punctuation"},{"start_time":"1.04","end_time":"1.14","alternatives":[{"confidence":"1.0","content":"Do"}],"type":"pronunciation"},{"start_time":"1.14","end_time":"1.27","alternatives":[{"confidence":"1.0","content":"you"}],"type":"pronunciation"},{"start_time":"1.27","end_time":"1.59","alternatives":[{"confidence":"1.0","content":"speak"}],"type":"pronunciation"},{"start_time":"1.59","end_time":"1.65","alternatives":[{"confidence":"0.9991","content":"a"}],"type":"pronunciation"},{"start_time":"1.65","end_time":"1.99","alternatives":[{"confidence":"1.0","content":"foreign"}],"type":"pronunciation"},{"start_time":"1.99","end_time":"2.59","alternatives":[{"confidence":"1.0","content":"language"}],"type":"pronunciation"},{"alternatives":[{"confidence":"0.0","content":"?"}],"type":"punctuation"},{"start_time":"2.88","end_time":"3.19","alternatives":[{"confidence":"0.9944","content":"One"}],"type":"pronunciation"},{"start_time":"3.19","end_time":"3.61","alternatives":[{"confidence":"0.991","content":"language"}],"type":"pronunciation"},{"start_time":"3.61","end_time":"3.75","alternatives":[{"confidence":"0.991","content":"is"}],"type":"pronunciation"},{"start_time":"3.75","end_time":"4.03","alternatives":[{"confidence":"1.0","content":"never"}],"type":"pronunciation"},{"start_time":"4.03","end_time":"4.48","alternatives":[{"confidence":"0.9079","content":"enough"}],"type":"pronunciation"},{"alternatives":[{"confidence":"0.0","content":"."}],"type":"punctuation"}]},"status":"COMPLETED"}
まとめ
ハンズオン資料がかなりしっかりしていたため、
特に困ることなく構築できました。
順序だてて丁寧に説明があるので、非常にわかりやすかったです。
こんな簡単に、システムを作れるとは面白いですね。 宿題 や +α があるので構築しようと思います。