書くきっかけ
Pythonコードの中に直書きしたHTMLを、クライアントからリクエストがあったときにブラウザで表示するコードを書いてみました。
自分の話で恐縮ですが、ちょっとApi GatewayとLambdaのテストをしてみたいと思ったときに、HTMLレスポンスが返せる簡単なLambda関数を用意したくなります。
そういった際に使えるのではと考えました。
使うもの
AWSで以下のものを使います。
- Api Gateway
- Lambda (Python 3.9)
やってみる
Lambda
以下の設定値でLambda関数を作成しました。ほかはデフォルトの設定値です。
| 項目 | 設定値 |
|---|---|
| 関数名 | htmlResponseFunc |
| ランタイム | Python 3.9 |
| ハンドラ | lambda_function.lambda_handler |
| アーキテクチャ | x86_64 |
コード
string型でHTMLを記述し、それをbytes型に変換するところがポイントだと思います。
import base64
def lambda_handler(event, context):
str_html = '''
<!DOCTYPE html>
<html lang="ja">
<head>
<title>TestTitle</title>
<meta charset="utf-8"/>
</head>
<body>
<h1>This is a test of ApiGateway and Lambda</h1>
</body>
</html>'''
bytes_html = bytes(str_html, 'utf-8')
result = base64.b64encode(bytes_html)
return result
Api Gateway
作成
以下の設定値でApi Gatewayを作成しました。
| 項目 | 設定値 |
|---|---|
| プロトコル | REST |
| API名 | htmlResponseApiGw |
| エンドポイントタイプ | リージョン |
リソース
GETメソッドのリソースを作ります。
統合タイプはLambda関数として、Lambda関数に先ほど作成したLambda関数の関数名を入力します。

メソッドレスポンスのコンテンツタイプのみtext/htmlに変更しました。

統合レスポンスのコンテンツの処理をバイナリに変換(必要な場合)に変更しました。

こちらをdevというステージを作成してデプロイしました。
URLの呼び出しに記載されてURLにアクセスしてみます。

結果
あとがき
こちらの簡単な環境を使用して、Api Gatewayのステージ変数の動作確認をやってみたいと思います。
参考サイト
