AWSの基礎 〜Part7: サーバーレスサービス〜
第7回の今回はAWSの提供するサーバレスサービスについてご紹介いたします。サーバレスサービスは近年マイクロサービスとして実装する際によく用いられるサービスとなります。使用する機会の多いサービスかと思いますので、知識として持っておくと良いでしょう。
はじめに
サーバーレスサービスとは
サーバーレスサービスとは、インフラストラクチャの管理やサーバーのプロビジョニングを必要とせずにアプリケーションやサービスを開発および実行できるクラウドコンピューティングのモデルです。FaaS (Function as a Service)と呼ばれることもあります。サーバーレスアーキテクチャでは、クラウドプロバイダーが自動的にリソースをスケーリングし、バックエンドのインフラを管理します。これにより、開発者はコードの記述とビジネスロジックに集中できます。現在では、その柔軟性や手軽さからマイクロサービスアーキテクチャをはじめとして、幅広く活用されています。
AWSの提供するサービス
AWSの提供する主なサーバーレスサービスとして、ここでは代表的な
・AWS Lambda
・AWS Step Functions
に絞って紹介させていただきます。
AWS Lambda
概要
AWS LambdaはAWSが提供するサーバーレスコンピューティングサービスです。Lambdaを使用すると、サーバーをプロビジョニングしたり管理することなく、コードを実行できます。これによりユーザーは実行したい処理を関数の形で記述し、トリガーとなる条件を選択するだけでサービスがデプロイできます。
利点
インフラストラクチャの管理やサーバーの管理を全てAWS側で負担するので、以下の点でメリットがあります。
・ コンピューティングリソースの動的なスケーリングとそれによる高可用性とパフォーマンスの保証
・ インフラ系の設定が不要で処理の記述のみで十分
・ 実行時間とリクエスト数に基づいた課金がなされるのでコストが最適化される
使用方法
概要でも述べたように、おおまかにユーザーが行うのは処理を記述することとトリガーを設定することのみです。具体的には以下の通りです。
1. Lambdaがアクセスする全てのリソースに対して適切な権限を与えたIAMロールを作成する
2. AWSマネジメントコンソール、AWS CLI、またはAWS SDKを使用して、Lambda関数を作成し、作成したロールをアタッチ
3. 行いたい処理内容を関数に記述
4. トリガーと送信先を必要に応じて設定
3の関数の記述においては、Python、Node.js、Java、C#、Go、Rubyなど、複数のプログラミング言語をサポートしています。ニーズ等に合わせて使用してください。また、トリガーについてもS3バケットへのファイルアップロード、DynamoDBテーブルの更新、API Gatewayリクエストをはじめとして多様なイベントに対応しています。
参考までにS3にファイルがアップロードされたタイミングでトリガーする関数をPythonで記述した際の例を下に示します。トリガーとしたevent情報が変数として与えられているので、そこから情報を抽出します。ただし、イベントトリガーについては別途設定が必要です。
また、Pythonではboto3モジュールがデフォルトで使用できる(追加のモジュールのダウンロードも可能)ので、これ経由で通常のプログラムと同じようにリソースにアクセスできます。
import json
import boto3
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
print(f'New file uploaded: {key} in bucket: {bucket}')
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
1については前回権限回りの解説を行ったので、こちらを参照してください。
AWS Step Functions
概要
AWS Step Functionsは、サーバーレスワークフローオーケストレーションサービスです。これは、複数のAWSサービスやカスタムアプリケーションロジックを順序付けして、実行するワークフローを作成するためのツールです。Step Functionsは、視覚的なワークフローデザイナーを提供し、状態マシンとしてワークフローを定義します。これにより、個々のタスクを容易に管理、監視、デバッグできます。
利点
Cloud Functionsの具体的なメリットは以下の点です。
・ 視覚的なインターフェースによる状態の遷移やエラー処理の簡単な定義
・ 高いスケーラビリティを持ち、複数のステップを並列で実行し大規模なワークロードに対応可能
・ 実行時間と実行されたステップの数に基づく課金によりコストが効率化される
・ 再試行機能等による信頼性の確保と監視・ロギングの実施
・ 様々なサービスとの統合が可能
最初の3つなどは特に、サーバーレスの拡張性を保った状態でフローの定義をできる部分となります。
使用方法
必要な処理はLambda同様、関数の定義とトリガーの設定です。
1. Step Functionsがアクセスする全てのリソースに対して適切な権限を与えたIAMロールを作成する
2. Amazon States Language (ASL)を用いた状態マシンの定義
3. コンソールを用いたマシンの作成
2の定義についてはJSON形式の独自言語を用いて記述します。以下に具体例を提示しますが、属性名等にここで触れることはしません。ただ、属性名が処理内容を表しているので基本的に困ることはないかと思います。
{
"Comment": "A simple AWS Step Functions state machine example",
"StartAt": "Step1",
"States": {
"Step1": {
"Type": "Task",
"Resource": "Lambda function URI1",
"Next": "Step2"
},
"Step2": {
"Type": "Task",
"Resource": "Lambda function URI2",
"End": true
}
}
}
3についてはLambdaと同様にコンソール上で別途設定が必要です。1についてはlambda同様、こちらを参照してください。
終わりに
第7回の今回はサーバーレスサービスについて紹介いたしました。実装以外の部分をあまり考えることなく、手軽に処理の実装を行うことができ、使用する機会も多いかと思いますので、ぜひ参考にしてみてください。