ScriptArts

好きな時に好きなことをやるサークル

LambdaでRestAPIを作ってお名前.comで買ったドメインから叩けるようにする

はじめに

手順が多くて忘れそうなので備忘録として書いておきます
AWS初心者、ネットワークの知識も殆ど持っていない人が書いたものなので間違っていたり無駄なことをしている可能性も大いにあります
執筆開始時点(2020/02/17)での情報のため、数ヶ月先や数年先でも通用する保証はありません

目次

用意するもの

API作成

Lambdaで関数を作る

まずはLambdaで最終的に叩きたいAPIの処理を書いていきます
Lambda を開き、 関数を作成 をクリック

f:id:mt224244:20200217122538p:plain

今回はNode.jsでHelloWorldを返すものを作りたいので、
一から作成 を選択して、関数名は helloWorld、ランタイムは Node.js 12.x を選んで 関数の作成 をクリック

f:id:mt224244:20200217123103p:plain

開いたページをスクロールしてみるとサンプルコードが既に入力してありますね

f:id:mt224244:20200217130005p:plain

このままでもいいですが、少し書き換えます

exports.handler = async (event) => {
    return {
        message: 'Hello, World!'
    };
};

左上の 保存 をクリックで保存
その隣の テスト をクリックして、 イベント名 に適当な名前を入力して 作成

f:id:mt224244:20200217130510p:plain

もう一度 テスト をクリックすると、コード下部に結果が表示されます

f:id:mt224244:20200217130755p:plain

Hello, World!が出ていたら関数は正常に動作しています

API GatewayでRestAPIとして叩けるようにする

APIの処理はできたので、これを外部から叩けるようにします
API Gateway を開き、 APIを作成 をクリック

f:id:mt224244:20200217132041p:plain

REST API (privateじゃない方) の 構築 をクリック

f:id:mt224244:20200217132340p:plain

プロトコルは REST 、その下は 新しいAPI を選択し、API名は HelloWorld API と入力して APIの作成 をクリック

f:id:mt224244:20200217133228p:plain

アクション ドロップダウンを開き メソッドの作成 を選択
下に出てきたドロップダウンから GET を選択して右のチェックマークをクリックで確定

f:id:mt224244:20200217141145p:plain

統合タイプはLambda、Lambda関数には最初の方で作ったLambdaの関数名を入力して 保存 をクリック
API GatewayがLambda関数を呼び出す権限を与えてもいいかのダイアログが開くので OK をクリック

f:id:mt224244:20200217141822p:plain

この画面で関数に渡すパラメータやCORSの設定をするのですが、今回は設定しません

f:id:mt224244:20200217142740p:plain

アクション ドロップダウンから APIのデプロイ を選択、デプロイされるステージに [新しいステージ] を選択して、ステージ名に適当な名前を付けて デプロイ をクリック

f:id:mt224244:20200217143412p:plain

開いたページにURLが表示されていると思います
これがAPIのURLです
URLをクリックして飛んでみるとLambdaでのテスト結果と同じものが表示されると思います

f:id:mt224244:20200217143953p:plain

カスタムドメインの設定が不要な場合はここまでで完成になります

カスタムドメイン設定

Route53でドメインを紐付ける

お名前.comで購入したドメインをAWSで使えるように紐付けします
Route53 を開き、左メニューから ホストゾーン を選択し、 ホストゾーンの作成 をクリック

f:id:mt224244:20200217163514p:plain

ドメイン名にはお名前.comで取得したドメインを入力し、 作成 をクリック
サブドメインでもOKです

f:id:mt224244:20200217164729p:plain

リストに項目が2つありますが、使用するのは値が4行ある方です
ここで一旦Route53を離れますが、後ほど何度か使用するのでタブは残しておいてください

f:id:mt224244:20200217165939p:plain

続いて、お名前.com側の設定です
ドメインNaviにログインし、 ドメイン設定 > DNS設定/転送設定 に進み、ドメインを選択して 次へ をクリック

f:id:mt224244:20200217171213p:plain

DNSレコード設定を利用する設定する をクリック

f:id:mt224244:20200217171625p:plain

ここで先程開いたままにしておいたRoute53の4行の値を追加します
TYPEは NS 、VALUEにそれぞれ入力します

f:id:mt224244:20200217172941p:plain

ページ下部の 確認画面へ進む > 設定する と進んで完了の表示が出たらお名前.comでの作業は終了です
反映には数分から数時間かかると思われます

Certficate Manaterで証明書を作成する

SSL化のため、証明書を発行します
Certficate Manager を開き、 証明書のリクエスト をクリック

f:id:mt224244:20200217195747p:plain

パブリック証明書のリクエスト を選択したまま 証明書のリクエスト をクリック

f:id:mt224244:20200217200122p:plain

ドメイン名に先程紐付けたドメインを入力して 次へ
このあとのページは何もいじらずそのまま進めてください

f:id:mt224244:20200217200541p:plain

最初のページに戻ってきたと思います
検証未完了 の下のドメイン名をクリックして開くと Route53 でのレコードの作成 というボタンがあるのでクリック
開いたダイアログの '作成' をクリック

f:id:mt224244:20200217202112p:plain

発行には少し時間がかかるようなので待ちます

f:id:mt224244:20200217202641p:plain

状況が 発行済み になったら完了です

f:id:mt224244:20200217220120p:plain

API Gatewayでカスタムドメインを設定する

発行した証明書を使って HelloWorld API にカスタムドメインを設定します
API Gateway を開き、左メニューから Custom domain names を選択し、 カスタムドメイン名を作成 をクリック

f:id:mt224244:20200217232756p:plain

ドメイン名に紐付けたドメインを入力、エンドポイントの設定は リージョン を選択
ACM証明書のドロップダウンで先程発行した証明書が選択できるはずなので選択して 保存

f:id:mt224244:20200217233107p:plain

作成できたら 編集 をクリックして マッピングの追加
パスは helloworld 、送信先には HelloWorld API 、後ろにはAPIデプロイ時に作成したステージを選択して 保存

Route53でDNSを設定する

仕上げです
Route53に戻り、 ページを更新してから レコードセットの作成 をクリック
名前は空欄のままエイリアスを はい にし、エイリアス先のドロップダウンから API Gateway の API に分類されているものを選択します

f:id:mt224244:20200217235130p:plain

作成 をクリックでリストの項目が1つ増えて4つになっていれば完了です

f:id:mt224244:20200218000007p:plain

これで全行程終了、ブラウザなどで https://[設定したドメイン]/helloworld を叩くとAPIの結果が表示されるはずです

おわりに

初めてブログを書きましたがかなり長いものになってしまいました
4800字ほど書いたみたいなんですが記事分けたほうがよかったんですかね…?

参考にしたサイト