API Gateway と Lambda で、特定のページにリダイレクトする 

# はじめに
前回の続きですが、題名の内容だけ知りたい方も参考になる書き方をします。

前回の続きだと、⑧htmlから起動などのLambda実行後、htmlページにリダイレクトするよう設定します。
[APIGateway＋Lambdaで、WebページからEC2の起動・停止・スペック変更を操作する①](https://qiita.com/holdout0521/items/f0cb3182bfb3785388a0)

# 事前準備
・Lambda作成
・ApiGateway作成
・S3などにhtmlを設置

# やりたいこと
## 初見の方用
`https:aaa.bbb.html`からLambdaを実行し(apiを叩き)、apiをリクエストしますが、レスポンス時`https:aaa.bbb.html`にリダイレクトさせます

```html:https//aaa.bbb.htmlページ

<a href="https://aaaaaa.execute-api.ap-northeast-1.amazonaws.com/prod/start?instance_id=i-xxxxxx">
ec2を起動する
</a>

```
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/3009b026-fafc-bb94-be2f-8002ae11e736.png">

## 前回の方用
前回の説明通り、htmlからEC2の起動をクリックするとページが遷移され、htmlへ戻るには戻るボタンを押す必要があります。
煩わしいので、遷移せずhtmlにリダイレクトするよう設定していきます。

# 流れ
①Lambdaの修正
②htmlの修正
③APIGatewayの設定

# ①Lambdaの修正
## 初見の方用

Lambdaに下記のように、リダイレクトしたいURLを`Location`に追加します。下3段があればよいです。
今回は`https:aaa.bbb.html`にリダイレクトする設定にします。

```py
def lambda_handler (event,context):

# 処理をお好きに記入

    header_location = ("https:aaa.bbb.html")
    result = {"Location": header_location}
    return result
```

## 前回の方用
Lambda3つ編集します。

```py:StartEC2
import boto3
import os

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=os.environ['region'])
    ec2.start_instances(InstanceIds=[event['instance_id']])
    
    header_location = ("https://aaaaaa.cloudfront.net/")
    result = {"Location": header_location}
    return result
```

```python:StopEC2
import boto3
import os

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=os.environ['region'])
    ec2.stop_instances(InstanceIds=[event['instance_id']])

    header_location = ("https://aaaaaa.cloudfront.net/")
    result = {"Location": header_location}
    return result
```

```python:SpecChangeEC2
import boto3
import os

def lambda_handler(event, context):
    NEW_INSTANCE_SIZE = event['instace_spec'] 
    ec2 = boto3.client('ec2', region_name=os.environ['region'])
    
    # stop
    ec2.stop_instances(InstanceIds=[event['instance_id']])
    waiter=ec2.get_waiter('instance_stopped')
    waiter.wait(InstanceIds=[event['instance_id']])
    
    #change
    ec2.modify_instance_attribute(InstanceId=event['instance_id'],
                                  Attribute='instanceType',
                                  Value=NEW_INSTANCE_SIZE)
    
    #start
    ec2.start_instances(InstanceIds=[event['instance_id']])
    
    header_location = ("https://aaaaaa.cloudfront.net/")
    result = {"Location": header_location}
    return result
```

# ②htmlの修正
## 初見の方用
特に編集はありません。

```html:https//aaa.bbb.htmlページ

<a href="https://aaaaaa.execute-api.ap-northeast-1.amazonaws.com/prod/start?instance_id=i-xxxxxx">
ec2を起動する
</a>

```

## 前回の方用

CheckEC2LambdaでEC2データを取得し、そのデータをhtml内にfetchしていますので、html内はキャッシュを常に削除する必要があります。
htmlに以下の3つをheadタグ内に加えます

```html
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">
```

# ③APIGatewayの設定
## 初見の方用
下記は作成済みで話を進めます。
・リソースを作成
・メソッドを作成(今回はGETメソッド)

1.メソッドレスポンスのHTTPステータス200を削除し、302を追加します。
また、ヘッダーレスポンスに`Location`を追加します。
[301ではだめな理由はこちらから](https://codenote.net/chrome/4666.html#301_%E3%81%98%E3%82%83%E3%81%AA%E3%81%8F%E3%81%A6_302_307_%E3%82%92%E4%BD%BF%E3%81%86)
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/e9eb4ae6-8a2d-583b-b19a-6dad092256b2.png">
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b3812062-9a0e-eb9a-ac17-c75cf8dadbf4.png">




2.統合リクエストのメソッドレスポンスステータス200を削除し、302に追加します
正規表現は`.*`、ヘッダーのマッピングの値は`integration.response.body.Location`にしてください。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/5a83eaee-eb0f-f1f8-a742-59232137edd1.png">

3.デプロイします。

## 前回の方用
初見の方用と同じように、`start`,`stop`、`specchange`のメソッドを修正してください。
デプロイ後、fetchできない場合、`check`を再度`CORS有効化`してみてください。


# 完成
下記の`https://aaaaaa.execute-api.ap-northeast-1.amazonaws.com/prod/start?instance_id=i-xxxxxx`をクリックすると、`https:aaa.bbb.html`にリダイレクトすると思います！
(もちろんLambdaは実行されます)

```html:https//aaa.bbb.htmlページ

<a href="https://aaaaaa.execute-api.ap-northeast-1.amazonaws.com/prod/start?instance_id=i-xxxxxx">
ec2を起動する
</a>

```

# 参考文献
[API Gateway + Lambdaで任意のURLにリダイレクトする方法](https://qiita.com/gp333/items/b79343af3ef220a7b472)
[API Gateway と Lambdaを使ってサーバレスでいい感じのリダイレクト環境を作る](https://dev.classmethod.jp/articles/api-gateway_lambda_redirect/)