← ハンズオン一覧に戻る

AWS Hands-on / Serverless

ブラウザからアクセスすると動くプログラムを作る

Lambda 関数に「関数 URL」という Web 用の住所を付けて、ブラウザでその URL を開くと関数が動き、その場で作ったページが表示されるようにします。サーバーを立てずに、URL ひとつで動く小さな Web ページを公開する体験です。コードは 1 行ずつ言葉で説明します。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 30〜50 分 すべてコンソールで完結
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須Lambda 関数をコンソールで作り、テスト実行した経験があること
  • あると良い「URL(Web ページの住所)」「HTML(ページの中身を書く書き方)」をなんとなく知っている

※ このハンズオンは すべてコンソールだけで完結します。コードはブラウザの中で書いて、できた URL もブラウザで開いて確認します。

🌱 プログラミングがはじめての人へ

コードはこのページにすべて用意してあります。コピーして貼り付けるだけで動きます。書いてある内容は 1 行ずつ日本語で説明するので、いま意味が分からなくても大丈夫。「URL を開くとプログラムが動く」という体験が目的です。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

Lambda の関数は、作っただけでは「テスト」ボタンからしか動かせません。でも実際には、外(インターネット)からアクセスされたときに動いてほしい場面がたくさんあります。たとえば「この URL を開いたら、その場であいさつページを表示する」といった使い方です。

そのために使えるのが 関数 URL です。関数に Web 用の住所(URL)を 1 つ付けると、ブラウザでその URL を開くだけで関数が動き、関数が返した内容がページとして表示されます。サーバーを立てずに、URL ひとつで動く小さな Web ページを公開できる、というわけです。

関数 URL があると、何が便利なの?

「テストボタンを押す」代わりに、ブラウザや他の人がアクセスするだけで関数を動かせるようになります。ちょっとした Web ページや、外部からの簡単な呼び出し口を、サーバーなしで用意できます。

URL を知っていれば、誰でもアクセスできてしまうの?

今回は学習のため、認証なし(誰でもアクセス可)で作ります。手軽に動きを試せますが、URL を知っている人は誰でも呼び出せます。本番では認証を付けたり、後片づけで消したりして、開けっ放しにしないことが大切です。

Goal

Lambda 関数に関数 URL を付け、ブラウザでその URL(https)を開くと、関数が作った Web ページが表示されることを確認する。

04 — Architecture

つくる構成

ブラウザが関数 URL にアクセスすると、Lambda 関数が動き、その場で作った HTML(ページの中身)を返します。ブラウザはそれを受け取って、ページとして表示します。

あなたのブラウザ
https://xxxxxxxx.lambda-url.ap-northeast-1.on.aws/
Lambda 関数(Python)
その場で HTML を作って返す
関数 URL は、関数に付く「Web 用の住所」です。ブラウザがここを開くと関数が動き、返ってきた HTML がページとして表示されます。
05 — Requirements

要件

以下の要件を満たし、ブラウザで関数 URL を開いてページが表示されることを確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2Lambda 関数を 1 つ作成する。ランタイムは Python(最新版でよい)。関数名は web-page-function(例)。
3関数のコードを、本文のサンプル(HTML のページを返す)に置き換えて保存(デプロイ)する。
4関数に 関数 URL を作成する。認証タイプは学習用に NONE(認証なし)とする。
5発行された関数 URL(https)をブラウザで開き、関数が返した Web ページが表示されることを確認する。
06 — Steps

構築の進め方

「関数を作る → ページを返すコードを貼る → 関数 URL を付ける → ブラウザで開く」の順に進みます。コードは貼り付けるだけ。意味は 1 行ずつ説明します。

  1. リージョンを合わせ、Lambda 関数を作る

    リージョンが東京であることを確認します。Lambda コンソールで「関数の作成」→「一から作成」を選び、関数名 web-page-function、ランタイム Python(最新版)で作成します。

  2. ページを返すコードを貼り付けて保存する

    「コードソース」のエディタの中身をすべて消して、次のコードを貼り付け、「Deploy(デプロイ)」を押して保存します。

    ざっくり言うと:アクセスされたら、簡単な Web ページ(HTML)を作って返すプログラムです。(細かい意味は、コードの下で 1 行ずつ説明します)

    lambda_function.py(このまま貼り付け)
    def lambda_handler(event, context):
        html = "<h1>こんにちは!</h1><p>これは Lambda が作ったページです。</p>"
        return {
            "statusCode": 200,
            "headers": { "Content-Type": "text/html; charset=utf-8" },
            "body": html
        }
    • def lambda_handler(event, context):関数の「入口」です。関数 URL にアクセスがあると、AWS がここを実行します。
    • html = "<h1>こんにちは!</h1>…"表示したいページの中身(HTML)を、html という入れ物に入れています。<h1> は大きな見出し、<p> は段落を表す書き方です。
    • return { ... }ブラウザに返す「返事のセット」を返しています。波かっこ { } は、いくつかの項目をまとめた入れ物です。
    • "statusCode": 200「成功しました」を表す番号です(200 = OK)。Web の世界では、この番号で結果を伝えます。
    • "headers": { "Content-Type": "text/html; charset=utf-8" }「この返事は HTML(Web ページ)で、日本語を含みます」とブラウザに伝えています。これがないと、ページにならず文字のまま表示されることがあります。
    • "body": html実際にブラウザへ表示する中身として、上で用意した html を入れています。
    字下げ(インデント)に注意

    2 行目以降の先頭の空白は、Python の大切なルールです。貼り付けた字下げを崩さないようにしましょう。

  3. 関数 URL を作成する(認証なし)

    関数の画面で「設定」タブ →「関数 URL」→「関数 URL を作成」を開きます。認証タイプNONE(認証なし)を選び、作成します。すると、https://……lambda-url.ap-northeast-1.on.aws/ のような URL が発行されます。

    関数 URL を作成 — 認証タイプの選択(イメージ)

    認証タイプ

    NONE(認証なし)
    誰でもアクセスできる
    AWS_IAM
    署名付きリクエストのみ許可

    ブラウザからそのまま開けるよう、学習用に NONE を選びます

    NONE を選ぶ意味

    NONE は「認証なしで、誰でもアクセスできる」設定です。学習中はすぐ試せて便利ですが、URL を知っている人は誰でも呼び出せる状態になります。確認が終わったら、後片づけで必ず削除しましょう。

  4. ブラウザで関数 URL を開いて確認する

    発行された関数 URL をコピーし、ブラウザのアドレス欄に貼り付けて開きます。「こんにちは!」の見出しと、説明の段落が表示されるはずです。これで、ブラウザからアクセスされたときに関数が動き、ページを返す仕組みができました。

    URL は https で始まる

    関数 URL は最初から https(暗号化された通信)になっています。自分でサーバーや証明書を用意しなくても、安全な通信で配信される点も便利なところです。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — ページにならず、文字や記号がそのまま表示される

「<h1> などの記号が、そのまま画面に出てしまう」

ブラウザに「これは HTML です」と伝えられていない可能性があります。headersContent-Typetext/html になっているか②コードを変えたあとに Deploy で保存したかを見直しましょう。Content-Type の指定がページ表示のカギです。

Pitfall 02 — URL を開いてもエラーになる/表示されない

「Forbidden などのエラーで、ページが出ない」

①関数 URL の認証タイプが NONE になっているか(認証ありだと、ブラウザでそのまま開いても拒否されます)、②URL を最後まで正しくコピーできているかを確認しましょう。コードの間違いでエラーになっている場合は、Lambda の「モニタリング」やログにエラー内容が出ます。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。Lambda コンソールとブラウザを開いて、次を順に確かめましょう。

  • 「関数」一覧に web-page-function があり、ランタイムが Python になっている。
  • 「設定」→「関数 URL」に、発行された URL が表示され、認証タイプが NONE になっている。
  • コードが Deploy 済み(変更が保存されている)。
  • ブラウザで関数 URL を開くと、「こんにちは!」の見出しと段落のページが表示される
  • その URL が https で始まっている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. 「テストボタンで動かす」のと「関数 URL で動かす」のとでは、どんな違いがあるでしょうか。関数 URL を付けると、何が新しくできるようになったかを考えてみましょう。
    ヒント
    テストボタンは自分(管理者)だけが押せる動かし方です。関数 URL を付けると、ブラウザや他の人が「外から」アクセスして動かせるようになります。「自分だけ」から「外からも」へ広がった、という観点で考えてみましょう。
  2. 今回は認証タイプを NONE(誰でもアクセス可)にしました。手軽な反面、どんな注意が必要でしょうか。開けっ放しにしておくと、どんなことが起こりうるか考えてみましょう。
    ヒント
    URL を知っている人は誰でも呼び出せるので、意図しない大量アクセスや、見せたくない処理を実行されるリスクがあります。学習では便利でも、本番では認証を付けたり、使い終わったら削除したりする必要がある、という観点で考えてみましょう。
  3. 今回のページは、いつアクセスしても同じ「こんにちは!」でした。アクセスのたびに内容が変わるページ(例:今の時刻を表示する、アクセスした人ごとに違う表示にする)にするには、プログラムをどう変えればよさそうでしょうか。
    ヒント
    関数は実行のたびに動くので、その中で「今の時刻を調べる」「渡された情報を見る」といった処理を加えれば、毎回違う結果を返せます。固定の文字を返す代わりに、その場で計算した結果を html に入れる、というイメージで考えてみましょう。
10 — Clean up

後片づけ

関数 URL は「認証なしで誰でもアクセスできる入口」です。学習が終わったら、開けっ放しにせず片づけましょう。

  1. 関数 URL を削除する:関数の「設定」→「関数 URL」で、作成した URL を削除します。これで外からのアクセス口が閉じます。
  2. 関数を削除する:使わない場合は、Lambda コンソールの「関数」一覧で web-page-function を選び、「アクション」→「削除」で消します。
Caution — 認証なしの URL を残さない

まず関数 URL を閉じる

認証なしの関数 URL を残したままにすると、誰でもアクセスでき、想定外の呼び出しにつながることがあります。学習を終えたら、関数 URL を削除するか、関数ごと削除して、開けっ放しにしないようにしましょう。

コストに関する注意: Lambda は、関数が呼び出されて動いた回数と時間に応じて課金されます(毎月かなりの回数・実行時間までの無料利用枠があり、学習での数回〜数十回のアクセスはほぼ無料の範囲です)。関数 URL を付けること自体に追加料金はかかりませんが、認証なしの URL を公開したまま放置して大量にアクセスされると、その分の実行が課金対象になりえます。気になる場合は、上の「後片づけ」で関数 URL と関数を削除しておきましょう。最新の料金は AWS の公式料金ページで確認してください。