はじめに
前回の続きですが、題名の内容だけ知りたい方も参考になる書き方をします。
前回の続きだと、⑧htmlから起動などのLambda実行後、htmlページにリダイレクトするよう設定します。
APIGateway+Lambdaで、WebページからEC2の起動・停止・スペック変更を操作する①
事前準備
・Lambda作成
・ApiGateway作成
・S3などにhtmlを設置
やりたいこと
初見の方用
https:aaa.bbb.html
からLambdaを実行し(apiを叩き)、apiをリクエストしますが、レスポンス時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つ編集します。
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
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
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の修正
初見の方用
特に編集はありません。
<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
,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は実行されます)
<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を使ってサーバレスでいい感じのリダイレクト環境を作る