新しいサーバーレースのサービスをやってみまして、S3のファイルからAppStoreやGoogle playに自動リダイレクトする。s3のファイルは自動にリダイレクト出来ますがDomainの設定は出来ませんのでインターフェースを使わなきゃ!
cloudfrontについて
Cloudfrontを使えますがまたACMが東京リージョンのため代替ドメインに設定できないです。
Amazon CloudFront で ACM 証明書を使用するには、米国東部 (バージニア北部) リージョン の証明書をリクエスト (またはインポート) していることを確認します。CloudFront ディストリビューションに関連づけられたこのリージョンの ACM 証明書は、このディストリビューションに設定されたすべての地域に分配されます。
残ってるはApi Gatewayになります!
Api Gateway
Api Gatewayは結構前から存在してまして、HTTP APIやRest Apiが使えますサービス。その上にACMを対応してますので使う!
それから色々探しましたが、Lambdaを使うは基本見たいで他の情報が少ないです:
Api GatewayがHttp Apiとして作成して、エンドポイントはLambdaでお任せしって、Lambdaが全部判断することになります。それがちょっと不満してました、コストも上がるし、Lambdaの制限もありますし、ただのリダイレクトだとS3のオブジェクトの設定だけで出来るはずなので他の方法を試してました。
こちの方がシンプルですし、Api Gatewayの制限がめちゃめちゃ楽なので気にしなくて良い!
Api gatewayのRest Api作成
まずはApi Gatewayが色々のシステム出来ます、httpsやLambda向けだったらHttp APIを使っても良いですがもっとコントロール欲しいになったらRest Apiが一番カスとマイズ出来ますので今回はそっしき行きました。
一旦Apiを作成します。作成したらからの画面にリダイレクトされます:
画面のトップとしてapiの名前とエンドポイントが表示されます。
流れとしては「リソース」を作成して、そのリソースに「メソッド」を作成します。
「Api Gatewayのエンドポイント」/「リソースA」/ 「リソースB」。。。
それで「リソースA」に対して「メソッドA」が対応してますなどなど!
でもリソースを作成するためにIAMロールが必要ですので説明します。
IAMの作成
このIAMがなにが必要と言われたら、S3の権限とApi GatewayのログをCloudwatchに連係する。
AwsS3readonly
もありますがいずれファイルアップロードも欲しくになりそうなのでAmazonS3FullAccess
を付けてます。AmazonAPIGatewayPushToCloudWatchLogs
も追加してたらもっと管理がしやすくになります。
そのロールを追加終わったらエンドポイントをどっかに保存した方が良い、割と使います。
ほぼ準備終わりましたので作成のフェーズに行きます!
リソースの作成
まずはリソースを作成します:
- リソース名
- リソースパス
そんなに登録する情報が少ないですが重要です!もちろん簡単のデータを入れれます、リソース名とパスをindex
にして、URLがApi Gatewayエンドポイント.com/index
になります。
でももっと面白いがこれです:
* リソース名:item
* リソースパス:{item}
なんで{}
を使った?付けたらこの情報をメソッドに使えます!そう使うとURLがApi Gatewayエンドポイント.com/{バリュ}
になりますのでつながるデータが違うになります!
APU Gateway CORSをチェックしてください!
パスはもう大丈夫だったら一番面白い部分になります、メソッドの作成です!
メソッドの作成
/{item}
を選択して、アクションのメニューにメソッドの作成をクリックしてみます。
追加されたselectインプットをメソッドにGetを選べますとチェックマークにクリックするとデフォルトの設定画面を見えます:
今回やろうとしてますはS3連係なのでこういう設定が良い:
ラベル | 質力 |
---|---|
統合タイプ | AWS サービス |
AWS リージョン | 自分のリージョン |
AWS サービス | Simple Storage Service (S3) |
AWS サブドメイン | (空) |
HTTP メソッド | GET |
アクション名の使用 | パス上書きの使用 |
パス上書き (省略可能) | 自分のバケットの名前/{item} |
実行ロール | さっき作られたIAMのロール |
コンテンツの処理 | パススルー |
デフォルトタイムアウトの使用 | そのままで |
最後はそうに見えるはず
無事に作成出来ましたらこの画面を見えます!
「メソッドリクエスト」と「メソッドレスポンス」が入れ口と出口、「統合リクエスト」と「統合レスポンス」がファイルに対してのインプットとアウトプットです。
パス上書きが一番重要です!パラメーターの流れを説明します、まずは「メソッドリクエスト」をクリックします、設定画面の「リクエストパス」をクリックして、「item」があるを確認する:
無事に設定されてれば良い!
次は「メソッドの実行」を戻って「統合リクエスト」をクリックします。この画面はさっき作成じた情報を見えますと変更できますが今回は「メソッドリクエスト」と「統合リクエスト」を連係しなきゃ。「パス上書き」に{item}ありますが、どこの情報はまだマッチングしてませんのでそれをやりましょう!下に「URL パスパラメータ」をクリックします:
情報としては「item」が「method.request.path.item」メソッドからきましたを書きます!チェックマークをクリックしたら無事に「メソッドリクエスト」と「統合リクエスト」がマッチングされてます!URLの{item}がやっとS3のファイルになってるはず!速攻にテストしましょう!
「メソッドの実行」の画面に戻して、左の「テスト」をクリックします、S3にあるファイル名を「パス」の「{item}」を書いて、テストのボタンをクリックしたら「ステータス: 200」を見えるはず!
右のログに色々いい情報もあります!
Endpoint request URI: https://s3.ap-northeast-1.amazonaws.com/redirect.me/index.html
それで無事にファイルをアクセスできます!
S3のリダイレクト
一番簡単ファイルアップロードはAWS APIを使います:
aws s3api put-object --bucket redirect.me --key qrcode1.txt --content-type "text/html" --website-redirect-location "https://google.com"
パラメーターの説明:
- --bucket : S3のバケット名
- --key : S3のファイル名(パスも入れられます)
- --content-type : "text/html"のままで
- --website-redirect-location : リダイレクト先のサイト
S3のファイルを確認すると:
$ curl -i https://s3.ap-northeast-1.amazonaws.com/redirect-analytics.metaps.com/qrcode1.txt
HTTP/1.1 200 OK
Date: Fri, 09 Dec 2022 08:39:04 GMT
Last-Modified: Fri, 09 Dec 2022 08:36:31 GMT
ETag: "d41d8cd98f00b204e9800998ecf8427e"
x-amz-website-redirect-location: https://www.google.com
Accept-Ranges: bytes
Content-Type: text/html; charset=utf-8
Server: AmazonS3
Content-Length: 0
x-amz-website-redirect-location
パラーメータがリダイレクト先です!
じゃ、S3もファイルありますし、Api Gatewayもアクセス出来るようになったので次は Api Gatewayでリダイレクトを設定しましょう!
Api Gatewayのリダイレクト方法
リダイレクトは割と簡単ですね、301のステータスコードとヘッダーの中で「Location」のパラメータあればなんとかできます。
まずはレスポンスコードをみましょう!Api Gatewayの設定を戻りますと「メソッドレスポンス」をクリックします。
デフォルトは200のレスポンスコードしかないです。今回はリダイレクトとnot foundしかないので200を削除して、301と404を設定します:
404は普通のファイルを見つかりませんでした設定ので追加はありません。
301はリダイレクト先の設定をしなきゃので「301」の左をクリックして、「301 のレスポンスヘッダー」の中に「ヘッダーの追加」して、Location
とContent-Type
を追加します
それでApi Gatewayがそのパラーメータを返せるけどまだどのデータは分かりませんので「統合レスポンス」の設定がマッピングしてます!
統合レスポンスの画面設定をクリックして、さっきと一緒で200を削除します!「統合レスポンスの追加」ボタンをクリックして301と404の設定をします。301はデフォルトにしますので「HTTP ステータスの正規表現」はデフォルトで空が良いです。
404の設定はちょっと違って、デフォルトは301の仕事なので404は4\d{2}
にします、それだと401や404が帰ってきたら全部404になります。
設定終わったらもう一回301をクリックして、「ヘッダーのマッピング」を表示します。
さっき設定した「Location」と「Content-Type」が表示してますがマッピングが空っぽですのでマッピングしましょう!
Content-Type :'text/html; charset=utf-8'
Location : integration.response.header.x-amz-website-redirect-location
さっきのcurl結果と一緒でレスポンスのヘッダーのx-amz-website-redirect-location
をすれば、S3のファイルの設定をいけます!
最後のテスト
それぞれの設定を終わったらテストをしましょう!テストの画面に戻って、さっきのファイルを名前書いて、レスポンスを確認しましょう!
ステータスを301を確認できます!レスポンスヘッダーの中も
Fri Dec 09 09:03:05 UTC 2022 : Method response headers: {X-Amzn-Trace-Id=Root=1-6392f9c9-177725437d6471d2757b6d34, Content-Type=text/html; charset=utf-8, Location=https://www.google.com}
それでAPI GatewayとS3の0byteファイルを無事にリダイレクト出来ます!
次回はACMとApi Gatewayとroute 53の連係を説明します!