5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-08-22

はじめに

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

前回の続きだと、⑧htmlから起動などのLambda実行後、htmlページにリダイレクトするよう設定します。
APIGateway+Lambdaで、WebページからEC2の起動・停止・スペック変更を操作する①

事前準備

・Lambda作成
・ApiGateway作成
・S3などにhtmlを設置

やりたいこと

初見の方用

https:aaa.bbb.htmlからLambdaを実行し(apiを叩き)、apiをリクエストしますが、レスポンス時https:aaa.bbb.htmlにリダイレクトさせます

https//aaa.bbb.htmlページ

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

前回の方用

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

流れ

①Lambdaの修正
②htmlの修正
③APIGatewayの設定

①Lambdaの修正

初見の方用

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

def lambda_handler (event,context):

# 処理をお好きに記入

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

前回の方用

Lambda3つ編集します。

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
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
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の修正

初見の方用

特に編集はありません。

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タグ内に加えます

<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ではだめな理由はこちらから

2.統合リクエストのメソッドレスポンスステータス200を削除し、302に追加します
正規表現は.*、ヘッダーのマッピングの値はintegration.response.body.Locationにしてください。

3.デプロイします。

前回の方用

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

完成

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

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にリダイレクトする方法
API Gateway と Lambdaを使ってサーバレスでいい感じのリダイレクト環境を作る

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?