-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
(#257) ### **User description** ## 概要 プロファイル画像を取得する API を作成 ## 変更点 - Lambda, API GW の CDK コードを追加 - Lambda 関数の中身の Python コードを追加 ## 影響範囲 既存の機能には影響なし ## テスト - pytest によりテストを実行 ## 関連 Issue - 関連 Issue: #244 ___ ### **PR Type** Enhancement ___ ### **Description** - プロファイル画像を取得するAPIを新たに実装しました。 - Lambda関数を追加し、S3から画像を取得してBase64エンコードした結果を返します。 - API GatewayにGETメソッドを追加し、ユーザーのプロフィール画像を取得できるようにしました。 - 画像取得関数に対するユニットテストを実装し、エラーハンドリングも確認しました。 ___ ### **Changes walkthrough** 📝 <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><table> <tr> <td> <details> <summary><strong>settings.ts</strong><dd><code>プロファイル画像取得用LambdaとAPIの追加</code> </dd></summary> <hr> src/backend/lib/constructs/settings.ts - プロファイル画像取得用のLambda関数を追加 - API GatewayにGETメソッドを追加 </details> </td> <td><a href="https://github.com/Kota8102/diary-app/pull/257/files#diff-e94c547bfdc2d716da1a4540ffc6f7208769c059a5af1bb9e241946b25fca7d4">+15/-0</a> </td> </tr> <tr> <td> <details> <summary><strong>get_profile_image.py</strong><dd><code>S3から画像を取得するLambda関数の実装</code> </dd></summary> <hr> src/backend/lambda/get_profile_image/get_profile_image.py - S3から画像を取得する関数を実装 - 画像をBase64エンコードして返す処理を追加 </details> </td> <td><a href="https://github.com/Kota8102/diary-app/pull/257/files#diff-d68e6102071444eb1156813d7061c6340ba7f7872d1bab66ac96ec0bdb90a7e1">+88/-0</a> </td> </tr> </table></td></tr><tr><td><strong>Tests</strong></td><td><table> <tr> <td> <details> <summary><strong>test_get_profile_image.py</strong><dd><code>プロファイル画像取得関数のテスト追加</code> </dd></summary> <hr> src/backend/test/pytest/test_get_profile_image.py - 画像取得関数のユニットテストを追加 - エラーハンドリングのテストを実装 </details> </td> <td><a href="https://github.com/Kota8102/diary-app/pull/257/files#diff-716d4c0ab2eb690df4faea3760dfc5c231811f2e7cefcf1e444a874feb11d9b6">+65/-0</a> </td> </tr> </table></td></tr></tr></tbody></table> ___ > 💡 **PR-Agent usage**: Comment `/help "your question"` on any pull request to receive relevant information
- Loading branch information
1 parent
81b8fdb
commit 8a2f23d
Showing
4 changed files
with
400 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
import base64 | ||
import logging | ||
import os | ||
|
||
import boto3 | ||
from botocore.exceptions import ClientError | ||
|
||
# ログ設定 | ||
logger = logging.getLogger() | ||
logger.setLevel(logging.INFO) | ||
|
||
|
||
def get_image_from_s3(key): | ||
""" | ||
S3 から画像データを取得 | ||
Args: | ||
key (string): S3 バケット内のファイルのキー(パス)。 | ||
Returns: | ||
bytes: 取得した画像データ。 | ||
string: 画像のコンテンツタイプ。 | ||
Raises: | ||
RuntimeError: S3 からデータを取得中にエラーが発生した場合。 | ||
""" | ||
# S3 クライアントの初期化 | ||
s3_client = boto3.client("s3") | ||
bucket = os.environ["USER_SETTINGS_BUCKET"] | ||
|
||
try: | ||
response = s3_client.get_object(Bucket=bucket, Key=key) | ||
data = response["Body"].read() | ||
content_type = response["ContentType"] | ||
return data, content_type | ||
except ClientError as e: | ||
if e.response["Error"]["Code"] == "NoSuchKey": | ||
raise FileNotFoundError( | ||
f"The key {key} does not exist in bucket {bucket}" | ||
) from e | ||
raise RuntimeError(f"Failed to retrieve image from S3: {str(e)}") from e | ||
|
||
|
||
def lambda_handler(event, context): | ||
""" | ||
Lambda 関数のエントリーポイント。API Gateway からのリクエストを処理し、ユーザーのプロフィール画像を S3 から取得。 | ||
Args: | ||
event (dict): API Gateway からのリクエストイベント。 | ||
context (object): Lambda 実行環境の情報。 | ||
Returns: | ||
dict: レスポンスコードとメッセージを含む辞書。 | ||
""" | ||
logger.info("get profile image function") | ||
try: | ||
# Cognito Authorizer から user_id を取得 | ||
user_id = event["requestContext"]["authorizer"]["claims"]["sub"] | ||
|
||
# S3 パスを設定 | ||
s3_key = f"profile/image/{user_id}.png" | ||
|
||
# S3 から画像を取得 | ||
image_data, content_type = get_image_from_s3(s3_key) | ||
|
||
# Base64 エンコード | ||
encoded_image = base64.b64encode(image_data).decode("utf-8") | ||
|
||
# 成功レスポンスを返す | ||
return { | ||
"statusCode": 200, | ||
"headers": { | ||
"Content-Type": content_type, | ||
"Content-Encoding": "base64", | ||
}, | ||
"body": encoded_image, | ||
"isBase64Encoded": True, | ||
} | ||
|
||
except FileNotFoundError as fe: | ||
logger.error(f"File not found: {str(fe)}") | ||
return {"statusCode": 404, "body": f"Image not found: {str(fe)}"} | ||
except RuntimeError as re: | ||
logger.error(f"Runtime error: {str(re)}") | ||
return {"statusCode": 500, "body": f"Server error: {str(re)}"} | ||
except Exception as e: | ||
logger.error(f"Unexpected error: {str(e)}") | ||
return {"statusCode": 500, "body": f"Failed to retrieve image: {str(e)}"} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.