AWS Lambda を使ってFizzBuzzしたった

# Backgroud
AWS Lambdaを使ったサーバレスアプリケーションについての話を聞く機会が増えたので試しに作ってみた。


# Preparetion

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/2fe4e9f9-abe4-e0ef-2843-06d92ed1bf65.png" width="75%">
↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/dc2834bd-f2eb-e0ec-2fd3-09f074780c96.png" width="75%">
↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/ef909c9f-b840-50da-cc3b-61a6cce66329.png" width="75%">

# Development (lambdaのみ)

```Python
import json

def lambda_handler(event, context):
    
    request = "[inner_test]"
    num = 30

    doc = {
        "message":'Hello from Lambda!',
        "request":process(num)
    }
    
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps(doc)
    }


def process(src):
    
    if src % 15 == 0:
        return "FizzBuzz"
    elif src % 5 == 0:
        return "Buzz"
    elif src % 3 == 0:
        return "Fizz"
    else :
        return src

```

と書いたのちに、「Deploy」 -> 「テスト」 を押す。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/67fda7f4-7577-bd93-0ab9-68eb4040e2dc.png" width="75%">

そうすると、、、
実行結果がログで出力される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/06d3c77e-b095-423d-e636-322a0d203e3c.png" width="75%">

# Development (with API Gateway)
先ほどの構成はlambdaのみだったが、ここではAPI Gatewayを使って外部からリクエストをかけてみる。

まず、トリガーからAPI Gatewayを選ぶ。
セキュリティはお好みで。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/75d2cbe9-8ff3-0755-569e-2efcc22e5f7d.png" width="75%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/0412aa9b-8e99-7c90-ba64-5638effe8889.png" width="75%">

「ステージ」→「POST」を選び、URLを取得する。
URL自体の構成は`https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/210348c2-ad64-6e68-ea67-b9e789a15509.png" width="75%">

それで、lambdaにてリクエストされた値を取得し、FizzBuzzする。コードベースで話すと`event["body"]`をjsonでパースして入力値を取得する。

```Python
import json

def lambda_handler(event, context):
    
    request = "[inner_test]"
    num = 30
    
    #API Gatewayに対応
    #ここでリクエストの値を取得
    if "body" in event.keys():
        request = json.loads(event["body"])
        num = request["num"]
        
    doc = {
        "message":'Hello from Lambda!',
        "request":process(num)
    }
    
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps(doc)
    }


def process(src):
    
    if src % 15 == 0:
        return "FizzBuzz"
    elif src % 5 == 0:
        return "Buzz"
    elif src % 3 == 0:
        return "Fizz"
    else :
        return src
```

実際にfizzbuzzの値が返ってくるか、Postmanを使ってAPIを叩いてみてみる。
`num` の値を変えると、`Fizz``Buzz``FizzBuzz`、数字のいずれかが返ってきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/237cf4d9-cf87-edff-e0a4-2a728850691e.png" width="75%">

これでできた。

# Future
サーバレス言わずに最小のVPS使って必要なパッケージ落とせばいいと思っていたのですが時間かけずにできた。
lambda処理後にS3とリンクすればデータは残せそうです。

# Reference
[Amazon API Gateway で REST API を呼び出す](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-call-api.html)