MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
AWS - Lambdaのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
AWS - Lambda
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == AWS Lambdaは、AWSが提供するサーバーレスコンピューティングサービスである。<br> サーバの管理やプロビジョニングを行うことなく、コードを実行できる環境を提供する。<br> <br> 主な特徴を以下に示す。<br> * サーバーレス *: サーバ管理、OS管理、パッチ適用が不要 * イベント駆動型 *: S3、DynamoDB、API Gateway等のイベントをトリガーに実行 * 自動スケーリング *: リクエスト数に応じて自動的にスケール * 従量課金 *: 実行時間とメモリ使用量に基づく課金 * 多言語対応 *: Python、Node.js、Java、Go、Ruby、.NET等をサポート <br> AWS Lambdaの基本概念を以下に示す。<br> * 関数 *: 実行するコードの単位 * トリガー *: 関数を起動するイベントソース * ランタイム *: コードを実行する環境 (言語とバージョン) * ハンドラ *: 関数のエントリーポイント * 実行ロール *: 関数が他のAWSサービスにアクセスするためのIAMロール <br> AWS Lambdaは永続的な無料利用枠を提供しており、個人利用や小規模なアプリケーションであれば無料枠内で運用できることが多い。<br> <br><br> == Lambdaの無料枠について == ==== 無料枠の内容 ==== * リクエスト数 : 月100万リクエストまで無料 * コンピューティング時間 *: 月40万GB秒まで無料 *: 128MBメモリで実行した場合、約320万秒 (約888時間) 相当 * その他 *: Lambda関数のコード保存は無料 *: CloudWatch Logsへの書き込みは別途課金対象 <br> <u>※注意</u><br> * <u>この無料枠は12ヶ月限定ではなく、永続的に利用可能である。</u> * <u>無料枠はアカウント全体で共有される。</u> * <u>データ転送料金は別途発生する場合がある。</u> * <u>同時実行数には制限があり、デフォルトは1000 (リージョンごと) である。</u> <br> ==== 料金体系 ==== 無料枠を超えた場合の料金 (東京リージョンの例)<br> <br> * リクエスト料金 ** $0.20 / 100万リクエスト *: <br> * コンピューティング料金 ** $0.0000166667 / GB秒 ** 例 : 128MBメモリで100ミリ秒実行 = 0.0125GB秒 ** 100万回実行の場合 : 約$0.21 *: <br> * 追加料金 ** Provisioned Concurrency : $0.000004861 / GB秒 ** Ephemeral Storage (512MB超過分) : $0.0000000309 / GB秒 <br><br> == Lambdaの停止 == AWS Lambdaには従来的な意味での停止という概念がない。<br> EC2のようなインスタンスベースのサービスとは異なり、Lambdaはイベント駆動型のサーバーレスサービスであり、実行されていない時は課金が発生しないためである。<br> <br> ==== コストを抑える方法 ==== 使用していない場合のコストを抑えるには、以下に示す選択肢がある。<br> <br> ===== 1. トリガーの無効化 ===== * イベントソース (CloudWatch Events、API Gateway等) を無効化する。 * 関数自体は残しておくことができる。 * トリガーがなければ実行されないため、コストは発生しない。 <br> ===== 2. 関数の削除 ===== * 完全に使用しない場合は削除する。 * コードはバージョン管理システム(Git等)で管理しておく。 <br> ===== 3. メモリサイズの最適化 ===== * 必要最小限のメモリサイズに設定する。 * ただし、メモリサイズはCPU性能にも影響するため、バランスが重要である。 * パフォーマンステストを行い、最適な値を見つける。 <br> ==== コスト構造について ==== 実行がない場合<br> * コード保存料金は発生しない。(無料) * CloudWatch Logsのストレージ料金のみ発生する可能性がある。 * 基本的にコストは0円またはほぼ0円 <br> 実行がある場合<br> * リクエスト数とコンピューティング時間に基づいて課金される。 * 例 : 128MBメモリ、100ミリ秒実行、月10万回の場合 *: リクエスト料金 : $0.02 *: コンピューティング料金 : $0.021 *: 合計 : 約$0.041/月 (約6円/月) <br> ==== コストを下げる方法 ==== * 実行時間の短縮 *: コードの最適化により実行時間を短縮する。 *: 不要な処理を削減する。 * メモリの最適化 *: 適切なメモリサイズを選択する。 *: 大きすぎるメモリは無駄なコストとなる。 * ログの管理 *: CloudWatch Logsの保持期間を適切に設定する。 *: 不要なログ出力を削減する。 <br> <u>完全に無料にするには、トリガーを無効化して関数を実行させないこと。</u><br> <br><br> == Lambda関数の作成 == ==== 1. マネジメントコンソールでの作成 ==== # AWSマネジメントコンソールにログインする。 # リージョンを選択する。 #: 東京リージョン : ap-northeast-1 # 検索バーに "Lambda" と入力して選択する。 # [関数の作成]を選択する。 <br> ==== 2. 作成オプション ==== # 作成方法を選択する。 #* 1から作成 (推奨) #*: 基本的な関数を自分で作成 #* ブループリントの使用 #*: テンプレートから作成 #* コンテナイメージ #*: Dockerイメージから作成 #: <br> # 関数名を入力する。 #: 例 : MyFunction # ランタイムを選択する。 #: 例 : Python 3.12、Node.js 20.x、Java 21 等 #: <u>※注意</u> #: <u>サポートされている最新バージョンを選択することを推奨する。</u> #: <br> # アーキテクチャ #: x86_64 または arm64 (Graviton2) #: arm64はコスト効率が良い。 #: <br> # アクセス権限 #* デフォルトの実行ロールを使用 #*: 基本的なLambda実行権限のみ #* 既存のロールを使用 #*: 事前に作成したIAMロールを指定 #* AWS ポリシーテンプレートから新しいロールを作成 #*: S3、DynamoDB等へのアクセス権限を持つロールを作成 # [関数の作成]を選択する。 <br> 関数が作成されると、コードエディタが表示される。<br> <br> ==== Python関数の例 ==== <syntaxhighlight lang="python"> # lambda_function.py def lambda_handler(event, context): # eventには入力データが含まれる # contextには実行環境の情報が含まれる print("イベント内容:", event) # 処理の例 name = event.get('name', 'World') message = f'Hello, {name}!' # レスポンスの返却 return { 'statusCode': 200, 'body': message } </syntaxhighlight> <br> ==== 関数設定の確認と変更 ==== 作成した関数を選択して、以下に示す項目を確認・変更する。<br> <br> * コードタブ *: 関数コードの編集、テストイベントの作成 * テストタブ *: テストイベントの作成と実行 * 設定タブ *: 一般設定 : タイムアウト(デフォルト3秒、最大15分)、メモリ (128[MB]〜10240[MB]) *: 環境変数 : キーと値のペアで設定 *: トリガー : イベントソースの追加 *: 送信先 : 成功・失敗時の送信先設定 *: アクセス権限 : 実行ロールの確認と変更 * モニタータブ *: CloudWatchメトリクス、ログの確認 <br><br> == Linux PCからのアクセス設定 == ==== AWS CLIのインストール ==== ===== 方法1 : pip経由 (推奨) ===== Python3をインストールする。<br> sudo apt update sudo apt install python3 python3-pip -y <br> AWS CLIをインストールする。<br> pip3 install awscli --user <br> 正常にインストールされているかどうかを確認する。<br> aws --version <br> ===== 方法2 : 公式インストーラ ===== AWS CLIをダウンロードおよびインストールする。<br> curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install <br> 正常にインストールされているかどうかを確認する。<br> aws --version <br> ==== アクセスキーの作成 ==== # AWSマネジメントコンソールで "IAM" を検索する。 # [ユーザ] - 作成したIAMユーザを選択する。 # [セキュリティ認証情報]タブを選択する。 # [アクセスキーを作成]を選択する。 # ユースケース : [コマンドラインインターフェイス (CLI)]を選択する。 # 確認のチェックボックスにチェックを入力する。 # [次へ]を選択する。 # 説明タグを入力する。(オプション) #: 例 : MyLinuxPC # [アクセスキーを作成]を選択する。 #: 重要 : アクセスキーIDとシークレットアクセスキーを控えておく。 #* シークレットキーは後で確認できない。 #* .csvファイルをダウンロードして安全に保管する。 <br> ==== AWS CLIの設定 ==== 設定コマンドを実行する。<br> aws configure <br> 以下に示すものを順番に入力する。<br> * AWS Access Key ID *: 作成したアクセスキーID * AWS Secret Access Key *: シークレットアクセスキー * Default region name *: 例 : ap-northeast-1 (東京リージョン) * Default output format *: json (推奨) <br> 設定ファイルの場所は以下の通りである。<br> * ~/.aws/credentials *: アクセスキー情報 * ~/.aws/config *: リージョンや出力形式 <br> ==== 接続テスト ==== Lambda関数一覧を取得する。<br> aws lambda list-functions <br> 特定の関数の情報を取得する。<br> aws lambda get-function --function-name MyFunction <br><br> == Lambdaの基本操作 (CLI) == ==== 関数の呼び出し ==== <syntaxhighlight lang="sh"> # 同期呼び出し(レスポンスを待つ) aws lambda invoke \ --function-name MyFunction \ --payload '{"name": "太郎"}' \ response.json # レスポンスの確認 cat response.json </syntaxhighlight> <br> ==== 関数の呼び出し (非同期) ==== <syntaxhighlight lang="sh"> # 非同期呼び出し(レスポンスを待たない) aws lambda invoke \ --function-name MyFunction \ --invocation-type Event \ --payload '{"name": "花子"}' \ response.json </syntaxhighlight> <br> ==== 関数コードの更新 ==== <syntaxhighlight lang="sh"> # ZIPファイルから更新 # まずコードをZIP化 zip function.zip lambda_function.py # 関数を更新 aws lambda update-function-code \ --function-name MyFunction \ --zip-file fileb://function.zip </syntaxhighlight> <br> ==== 環境変数の設定 ==== <syntaxhighlight lang="sh"> # 環境変数の設定 aws lambda update-function-configuration \ --function-name MyFunction \ --environment Variables="{DB_HOST=localhost,DB_PORT=5432}" </syntaxhighlight> <br> ==== タイムアウトとメモリの変更 ==== <syntaxhighlight lang="sh"> # タイムアウトを30秒、メモリを512[MB]に設定 aws lambda update-function-configuration \ --function-name MyFunction \ --timeout 30 \ --memory-size 512 </syntaxhighlight> <br> ==== ログの確認 ==== <syntaxhighlight lang="sh"> # CloudWatch Logsのログストリーム一覧を取得 aws logs describe-log-streams \ --log-group-name /aws/lambda/MyFunction \ --order-by LastEventTime \ --descending \ --max-items 1 # ログイベントの取得 aws logs get-log-events \ --log-group-name /aws/lambda/MyFunction \ --log-stream-name 'ログストリーム名' </syntaxhighlight> <br> ==== 関数の削除 ==== <syntaxhighlight lang="sh"> # 関数の削除 aws lambda delete-function \ --function-name MyFunction </syntaxhighlight> <br><br> == Python SDK (boto3) の使用 == 以下の例では、Pythonを使用してAWS Lambdaを操作している。<br> <br> まず、boto3をインストールする。<br> pip3 install boto3 --user <br> <syntaxhighlight lang="python"> # lambda_client_example.py import boto3 import json # Lambdaクライアントの作成 lambda_client = boto3.client('lambda', region_name='ap-northeast-1') # 関数の呼び出し(同期) def invoke_function(): response = lambda_client.invoke( FunctionName='MyFunction', InvocationType='RequestResponse', # 同期呼び出し Payload=json.dumps({ 'name': '山田太郎' }) ) # レスポンスの取得 response_payload = json.loads(response['Payload'].read()) print("レスポンス:", response_payload) print("ステータスコード:", response['StatusCode']) # 関数の呼び出し (非同期) def invoke_function_async(): response = lambda_client.invoke( FunctionName='MyFunction', InvocationType='Event', # 非同期呼び出し Payload=json.dumps({ 'name': '佐藤花子' }) ) print("非同期呼び出し完了:", response['StatusCode']) # 関数の一覧取得 def list_functions(): response = lambda_client.list_functions() for func in response['Functions']: print(f"関数名: {func['FunctionName']}") print(f" ランタイム: {func['Runtime']}") print(f" メモリサイズ: {func['MemorySize']}MB") print(f" タイムアウト: {func['Timeout']}秒") print() # 関数の設定取得 def get_function_config(): response = lambda_client.get_function_configuration( FunctionName='MyFunction' ) print("関数設定:") print(f" メモリサイズ: {response['MemorySize']}MB") print(f" タイムアウト: {response['Timeout']}秒") print(f" ランタイム: {response['Runtime']}") print(f" ハンドラ: {response['Handler']}") # 環境変数の更新 def update_environment_variables(): response = lambda_client.update_function_configuration( FunctionName='MyFunction', Environment={ 'Variables': { 'DB_HOST': 'mydb.example.com', 'DB_PORT': '3306', 'DEBUG': 'true' } } ) print("環境変数更新完了") # メイン処理 if __name__ == '__main__': invoke_function() # invoke_function_async() # list_functions() # get_function_config() # update_environment_variables() </syntaxhighlight> <br> # 実行方法 python3 lambda_client_example.py <br> ==== Lambda関数内でのboto3の使用 ==== Lambda関数内で他のAWSサービスにアクセスする場合の例を以下に示す。<br> <br> <syntaxhighlight lang="python"> # lambda_function.py (DynamoDBへのアクセス例) import boto3 import json from datetime import datetime dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('MyTable') def lambda_handler(event, context): try: # DynamoDBにデータを保存 item = { 'id': event.get('id', '001'), 'timestamp': datetime.now().isoformat(), 'data': event.get('data', {}) } table.put_item(Item=item) return { 'statusCode': 200, 'body': json.dumps({ 'message': 'データ保存成功', 'item': item }) } except Exception as e: print(f"エラー: {str(e)}") return { 'statusCode': 500, 'body': json.dumps({ 'message': 'エラーが発生しました', 'error': str(e) }) } </syntaxhighlight> <br> <u>※注意</u><br> <u>この関数を実行するには、Lambda実行ロールにDynamoDBへのアクセス権限が必要である。</u><br> <br> ==== デバッグ方法 ==== <syntaxhighlight lang="sh"> # AWS CLIのデバッグモード aws lambda invoke --function-name MyFunction --payload '{}' response.json --debug </syntaxhighlight> <br> <syntaxhighlight lang="python"> # Lambda関数内でのログ出力 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info(f"受信したイベント: {event}") logger.debug(f"コンテキスト情報: {context}") # 処理... return {'statusCode': 200} </syntaxhighlight> <br><br> == セキュリティ == ==== 実行ロールの設定 ==== Lambda関数が他のAWSサービスにアクセスするには、適切なIAMロールが必要である。<br> <br> * 基本的な実行ロールのポリシー例 <syntaxhighlight lang="json"> { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] } </syntaxhighlight> <br> * DynamoDBアクセスを含むポリシー例 <syntaxhighlight lang="json"> { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:GetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:ap-northeast-1:*:table/MyTable" } ] } </syntaxhighlight> <br> ==== 環境変数での機密情報管理 ==== * 機密情報 (APIキー、パスワード等) はコードに直接記述しない。 * 環境変数を使用する。 * より安全性を高めるには AWS Secrets Manager または AWS Systems Manager Parameter Store を使用する。 <br> * Secrets Managerの使用例 <syntaxhighlight lang="python"> import boto3 import json def get_secret(secret_name): client = boto3.client('secretsmanager', region_name='ap-northeast-1') response = client.get_secret_value(SecretId=secret_name) secret = json.loads(response['SecretString']) return secret def lambda_handler(event, context): # シークレットの取得 db_credentials = get_secret('myapp/database') db_host = db_credentials['host'] db_password = db_credentials['password'] # データベース接続処理 # ...略 </syntaxhighlight> <br> ==== VPCアクセス ==== Lambda関数をVPC内のリソース (RDS、ElastiCache等) に接続する場合<br> <br> 設定方法<br> # Lambda関数の設定で VPC を選択する。 # サブネット(プライベートサブネット推奨)を選択する。 # セキュリティグループを選択する。 # 実行ロールに以下の権限を追加する。 <syntaxhighlight lang="json"> { "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface" ], "Resource": "*" } </syntaxhighlight> <br> <u>※注意</u><br> * <u>VPC接続により、コールドスタート時間が増加する可能性がある。</u> * <u>インターネットアクセスが必要な場合は、NATゲートウェイが必要となる。</u> <br> ==== レイヤーの使用 ==== 複数の関数で共通のライブラリや依存関係を共有する場合、Lambdaレイヤーを使用する。<br> <br> * レイヤーの作成例 <syntaxhighlight lang="sh"> # ライブラリのインストール mkdir python pip3 install requests -t python/ # ZIPファイルの作成 zip -r my-layer.zip python/ # レイヤーの作成 aws lambda publish-layer-version \ --layer-name my-dependencies \ --zip-file fileb://my-layer.zip \ --compatible-runtimes python3.12 </syntaxhighlight> <br> * 関数へのレイヤー追加 <syntaxhighlight lang="sh"> aws lambda update-function-configuration \ --function-name MyFunction \ --layers arn:aws:lambda:ap-northeast-1:123456789012:layer:my-dependencies:1 </syntaxhighlight> <br><br> == トラブルシューティング == ==== エラー : "Task timed out after X seconds" ==== * 原因 *: 関数の実行がタイムアウト設定を超えた * 解決方法 *: タイムアウト設定を延長する(最大15分) *: コードを最適化して実行時間を短縮する *: 長時間処理の場合は Step Functions の使用を検討する <br> ==== エラー : "AccessDeniedException" ==== * 原因 *: 実行ロールに必要な権限がない * 解決方法 *: Lambda実行ロールに適切なIAMポリシーをアタッチする *: CloudWatch Logsでエラー詳細を確認する <br> ==== エラー : "Out of memory" ==== * 原因 *: メモリ設定が不足している * 解決方法 *: メモリサイズを増やす。(128[MB]〜10240[MB]) *: メモリリークがないかコードを確認する。 *: 大きなファイル処理の場合は、S3 または EFS の使用を検討する。 <br> ==== エラー : "ResourceNotFoundException" ==== * 原因 *: 指定した関数が存在しない、または、リージョンが違う。 * 解決方法 *: 関数名とリージョンを確認する。 *: 関数が削除されていないか確認する。 <br> ==== コールドスタートの遅延 ==== * 原因 *: 関数が初回実行時または長時間未使用後に実行環境の初期化が必要。 * 解決方法 *: Provisioned Concurrencyを使用する。(有料) *: メモリサイズを増やす。(CPU性能も向上) *: 依存関係を最小化する。 *: Lambda SnapStartを使用する。(Java限定) <br> ==== VPC接続の問題 ==== * 原因 *: VPC設定が正しくない、または、セキュリティグループの設定に問題がある。 * 解決方法 *: サブネットにルートテーブルが正しく設定されているか確認する。 *: セキュリティグループのインバウンド・アウトバウンドルールを確認する。 *: NATゲートウェイまたはVPCエンドポイントの設定を確認する。 <br> ==== デバッグのヒント ==== * CloudWatch Logsの活用 *: print文やlogging.info()でログを出力する。 *: ログ保持期間を適切に設定する。 * X-Rayの使用 *: 関数の実行トレースを可視化する。 *: ボトルネックを特定する。 * ローカルでの試験 *: AWS SAM CLIを使用してローカル環境で試験する。 *: Dockerを使用して、Lambda実行環境を再現する。 <br><br> __FORCETOC__ [[カテゴリ:Web]]
AWS - Lambda
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse