AWS SAMを用いたLambdaのローカル開発×デプロイ

# **はじめに**
## **サービス概要**
本記事では、旅行者向けの情報共有プラットフォーム「旅BASE」のバックエンド構築について解説します。このサービスは、Reactを用いたフロントエンドとAWSのサーバーレス技術を活用したバックエンドで構成されています。ユーザーは簡単に旅行プランを作成・共有できる機能を利用できます。

サービスの詳細は以下のリンクをご覧ください：

https://www.tabibase.com

---

## **アーキテクチャ構成**
以下は、本サービスにおけるAWSを活用した全体的なアーキテクチャ構成図です。

![ブログ機能_UI設計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628846/f8af726c-ccf7-7905-a70e-9b07c5194fe5.png)


### **この記事のスコープ**
本記事では、上記アーキテクチャのうち、**バックエンドプロジェクト**に焦点を当てて解説します。具体的には以下の内容をカバーします：
1. **API Gateway**: HTTPエンドポイントの作成。
2. **Lambda関数**: Pythonで実装されたビジネスロジック。
3. **SAMファイル**: AWSリソース管理用テンプレートの生成と編集。
4. **デプロイ自動化**: `deploy.sh`スクリプトによるLambda関数の更新。

これにより、チーム開発で効率的にバックエンドプロジェクトを管理し、GitHubで共有可能な環境を構築します。

---

以降の記事では、このスコープに基づいて具体的な手順を説明していきます。

## **ステップ1: Lambda関数の作成**
1. **AWSコンソールにログイン**し、[Lambdaサービス](https://console.aws.amazon.com/lambda/)を開きます。
2. 「関数の作成」をクリックし、「スクラッチから作成」を選択。
   - 関数名: `MyLambdaFunction`
   - ランタイム: `Python 3.12`
   - 実行ロール: 新しいロールを作成（デフォルト設定）
3. 関数コードに以下のPythonコードを記述します：

```python
import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

4. 「Deploy」をクリックして関数を保存。

---

## **ステップ2: API Gatewayの設定**
1. [API Gatewayコンソール](https://console.aws.amazon.com/apigateway/)に移動し、「APIの作成」をクリック。
2. 「REST API」を選択し、「構築」をクリック。
3. 設定で以下を入力し、「APIの作成」をクリック:
   - APIの詳細: `新しいAPI`
   - API名: 例. `MyAPI`
   - APIエンドポイントタイプ: `リージョン`
4. リソースの作成から、以下の設定を入力して「リソースの作成」をクリック:
   - リソースパス: 例. `/`
   - リソース名: 例. `test`
5. メソッドの作成から、以下の設定を入力して「メソッドの作成」をクリック:
   - メソッドタイプ: `GET`
   - 統合タイプ: Lambda関数
   - Lambda関数名: `MyLambdaFunction`
6. 「デプロイ」をクリックし、ステージ名（例: `dev`）を入力。

---

## **ステップ3: AWS SAMプロジェクトの構築**
1. 必要なツールをインストール:
   - [AWS CLI](https://aws.amazon.com/cli/)
   - [AWS SAM CLI](https://aws.amazon.com/serverless/sam/)
   - Docker
2.  **AWSコンソールにログイン**し、[Lambdaサービス](https://console.aws.amazon.com/lambda/)を開きます。
3. ダウンロード＞両方ダウンロードをクリックし、zipファイルを取得。
4. 任意のフォルダに解凍し、以下のようになればOK。 
    ```bash
    .
    └── MyLambdaFunction
        ├── src
        │   └── lambda_function.py
        └── template.yml
    ```
5. lambda_function.pyを以下のように編集
    ```python:src/lambda_function.py
    import json
    
    def lambda_handler(event, context):
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from Updated Lambda!')
        }
    ```
---

## **ステップ4: ローカル環境でのテスト**
1. プロジェクトディレクトリに移動:
```bash
cd MyLambdaFunction
```
2. ビルドコマンドを実行:
```bash
sam build
```
3. ローカルAPIサーバーを起動:
```bash
sam local start-api
```
4. ブラウザまたはcurlでエンドポイントをテスト:
```bash
curl http://localhost:3000/test
```
`Hello from Updated Lambda!`と返ってきたらテストは成功。

---

## **ステップ5: Lambdaコードのデプロイ**
1. 新しく`deploy.sh`を作成します：
    ```bash
    MyLambdaFunction
    ├── deploy.sh
    ├── src
    │   └── lambda_function.py
    └── template.yml
    ```
    　
2. `deploy.sh`スクリプトの作成
    ```bash:deploy.sh
    #!/bin/bash
    
    ZIP_FILE="lambda.zip"
    FUNCTION_NAME="MyLambdaFunction"
    SRC_DIR="./src"
    
    # ./src配下のファイルとフォルダをzip化
    echo "Zipping source files from $SRC_DIR..."
    cd $SRC_DIR
    zip -r ../$ZIP_FILE ./*
    cd ..
    
    # Lambda関数の更新
    echo "Updating Lambda function $FUNCTION_NAME with $ZIP_FILE..."
    aws lambda update-function-code --function-name $FUNCTION_NAME --zip-file fileb://$ZIP_FILE
    
    # zipファイル削除
    echo "Deleting zip file $ZIP_FILE..."
    rm $ZIP_FILE
    
    echo "Deployment complete."
    ```
    　
3. スクリプトの実行
    ```
    chmod +x deploy.sh
    bash deploy.sh
    ```

---

## 補足① AWS CLIのアカウント登録（アクセスキーの登録から）
1. **AWSコンソールにログイン**し、[IAMサービス](https://console.aws.amazon.com/iam/)を開きます。
1. 「ユーザ」から対象のユーザを選択し、「概要」からアクセスキーを作成をクリック。
1. 任意の名前を設定し、**アクセスキー**と**シークレットアクセスキー**を保存。
1. コマンドラインで以下を実行し、アカウントをAWS CLIに登録：
    ```bash
    aws configure --profile biz
    　AWS Access Key ID [None]: {アクセスキー}
    　AWS Secret Access Key [None]: {シークレットアクセスキー}
    　Default region name [None]: ap-northeast-1
    　Default output format [None]: {空白}
    ```
1. 以下のコマンドで内容を確認：
    ```bash
    aws configure list
    ```

---

## **ステップ6: GitHubへの共有**
1. プロジェクト全体（`sam-app`ディレクトリ）をGitHubリポジトリにプッシュします：
    ```bash
    git init
    git add .
    git commit -m "Initial commit"
    git branch -M main
    git remote add origin <your-repo-url>
    git push -u origin main
    ```

---

## **まとめ**
この手順では、AWS LambdaとAPI Gatewayを使用したバックエンド構築からローカル開発、デプロイ、GitHub共有まで一連の流れを紹介しました。AWS SAMは効率的なサーバーレス開発環境を提供するため、チーム開発にも適しています。