2
3

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を作成して静的HTMLからAPIをコールできる環境を実装する

Last updated at Posted at 2022-02-04

この記事の目的は?

以下のことが学べます

  • API Gatewayを使ってAPIを公開する手法
  • 静的HTMLからAPIをコールするために考慮すべきナレッジ

本記事は内容をAPIの公開に全振りするために

前回の記事S3とCloudFrontで静的WEBホスティングを公開する手法で構築したS3+CloudFrontの構成を流用する前提で作っております

構成図

一旦マネージメントコンソールで手動作成すれば、IaC(Infrastructure as Code)化の際にもイメージしやすいでしょう

kousei1.png

この記事の構成

記事の前半ではAPI GatewayでAPIを公開する準備をします

なお本記事ではバックエンドAPIを作成せず、サンプルAPIでAPI Gatewayの動作を確認します

このサンプルAPIはバックエンドロジックを持たず、常に固定のレスポンスを返します

  1. API Gatewayを作成  

  2. サンプルAPIをデプロイ

記事の後半では静的HTMLからサンプルAPIをコールするために必要な設定を加えます

最後に作成したAPIのコールテストをして終了です

​ 3.S3の静的HTMLをAPIコールする内容に書き換え

​ 4.CORSを設定

​ 5.APIコールテスト

1.API Gatewayを作成

まずはAPIをコールするための準備としてAPI Gatewayを作成します

マネジメントコンソール→API GatewayAPIを作成を選択

13.PNG

構成が簡単で、かつサンプルAPIが用意されている RESTAPIを選択

インポートを押します

14.PNG

"プロトコルを選択 する"はREST

"新しいAPIの作成"は APIの例

にチェックを入れ、最下部のインポートを選択

15.PNG

API Gatewayが用意してくれたサンプルAPI PetStoreが作成されました

16.PNG

2. サンプルAPIをデプロイ

作成したPetStoreをAPI Gatewayへ反映させるために アクションAPIのデプロイを選択

"デプロイされるステージ" は**[新しいステージ]**

"ステージ名" は任意の名前(分かりやすくdevにします)

デプロイ実行!

20.PNG

APIが無事作成されると、URLの呼び出しにAPIを呼び出すURLが表示されます

このAPIはブラウザからもアクセスできるので、ブラウザ経由でAPIが作られているかを確認してみましょう

21.PNG

ブラウザからアクセスして、Welcome to your Pet Store API というウェルカムページが返ってきたはずです

22.PNG

さらに次はAPIを直接叩いてレスポンスを確認しましょう

gg.PNG

API Gatewayのリソース画面です

/の下に/petsがあります、これがAPI本体です

先程のURLの末尾に**/pets**を付け足して

https://(先程アクセス成功したPetStoreのURL)/pets

アクセスして返ってきた画面がこちらです

ff.PNG

1.dog 2.cat 3.fish …といった、ペットショップの商品リストようなレスポンスが返ってきました

無事、サンプルAPIがデプロイされ、APIが機能していることを確認できました

3. S3の静的HTMLをAPIコールする内容に書き換え

前回の記事S3とCloudFrontで静的WEBホスティングを公開する手法で作成した静的HTMLを直接編集し

APIをコールする内容に書き換えます

取得内容を確認する手段はいくつかはありますが、前回の構成から確認できるようjqueryを利用して

取得した結果を表示して確認できるようにします

<!DOCTYPE html>
<html

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <script>
    function callapi() {
      $.ajax({
        type: "GET",
        url: "https://(たった今アクセス成功したPetStore APIのURL)/pets",
      }).done(function (data, status, xhr) {
        alert(JSON.stringify(data));
      }).fail(function (xhr, status, error) {
        alert('http error:' + xhr.status);
      });
    }
  </script>
</head>

<body>
  <h1>API Gateway Test</h1><br>
  <INPUT type="button" name="btnA" value="call api gateway(get log)" onclick="callapi()">
</body>

</html>

4. CORSを設定

このままでは静的HTMLのオリジンからAPI Gatewayのオリジンに遷移する際にエラーが起きます

エラーの原因は、ブラウザのセキュリティ機能によるものです

通常、ブラウザは同じドメインへのHTTPリクエストのスクリプト実行を許可していますが、異なるドメインへの場合はこれを制限します

これを回避するために**CORS(Cross-Origin Resource Sharing)**を設定する必要があります

実際に設定して、動作を確認してみましょう

マネジメントコンソールでS3

該当バケットを開き、アクセス許可を選択

cc.PNG

最下部に**Cross-Origin Resource Sharing(CORS)**の欄があるので

編集ボタンを押して設定を追加して変更の保存をしましょう

dd.PNG

CORS設定内容

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD",
            "POST"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

無事CORSが設定されました

(今回はテストなのでAllowedOriginsはあえて絞らず "*" 設定していますが、実稼働するサービスでは対象を選定して設計しましょう)

Cross-Origin Resource Sharing (CORS) の使用

Cross-Origin Resource Sharing (CORS) は、特定のドメインにロードされたクライアントウェブアプリケーションが異なるドメイン内のリソースと通信する方法を定義します
Amazon S3 の CORS のサポートによって、Amazon S3 でリッチなクライアント側ウェブアプリケーションを構築し、Amazon S3 リソースへのクロスオリジンアクセスを選択的に許可できます

5. APIコールテスト

ではいよいよAPIのコールテストをします

前回の記事S3とCloudFrontで静的WEBホスティングを公開する手法で作成したCloudFrontディストリビューションドメイン名のURLにアクセスします

通信の概要図

通信の流れはこのようなイメージです

まずClientPCからリクエストを受けたCloudFrontは、S3からキャッシュしたindex.htmlをClientPCへ返します

kousei2.png

index.htmlにはAPIをコールするボタンが設置してあります

ClientPCは受けとったindex.htmlのAPIコールボタンを押すとAPI Gateway→PetStoreへリクエストを投げ、そのレスポンスはブラウザに表示されます

kousei3.png

先程、静的HTMLをAPIコールする内容に書き換えているので

下画面のようなAPIをコールするボタンが表示されます

ここでCall api gateway を押すと・・・

aa.PNG

API GatewayにデプロイしたPetStoreAPIを無事呼び出すことができました!

ee.PNG

返ってきた値は、先ほどAPIのレスポンス確認で見た内容と同じ

1.dog 2.cat 3.fish …といった、ペットショップの商品リストようなレスポンス内容ですね

終わりに

無事にAPI機能を持ったWEBサイトを作成できました

次回は、今回構築した構成にcognito認証を追加して特定のユーザーのみアクセスできる機能を追加する記事を作成予定です

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?