はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須Lambda 関数をコンソールで作り、テスト実行した経験があること
- あると良い「URL(Web ページの住所)」「HTML(ページの中身を書く書き方)」をなんとなく知っている
※ このハンズオンは すべてコンソールだけで完結します。コードはブラウザの中で書いて、できた URL もブラウザで開いて確認します。
🌱 プログラミングがはじめての人へ
コードはこのページにすべて用意してあります。コピーして貼り付けるだけで動きます。書いてある内容は 1 行ずつ日本語で説明するので、いま意味が分からなくても大丈夫。「URL を開くとプログラムが動く」という体験が目的です。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
Lambda の関数は、作っただけでは「テスト」ボタンからしか動かせません。でも実際には、外(インターネット)からアクセスされたときに動いてほしい場面がたくさんあります。たとえば「この URL を開いたら、その場であいさつページを表示する」といった使い方です。
そのために使えるのが 関数 URL です。関数に Web 用の住所(URL)を 1 つ付けると、ブラウザでその URL を開くだけで関数が動き、関数が返した内容がページとして表示されます。サーバーを立てずに、URL ひとつで動く小さな Web ページを公開できる、というわけです。
関数 URL があると、何が便利なの?
「テストボタンを押す」代わりに、ブラウザや他の人がアクセスするだけで関数を動かせるようになります。ちょっとした Web ページや、外部からの簡単な呼び出し口を、サーバーなしで用意できます。
URL を知っていれば、誰でもアクセスできてしまうの?
今回は学習のため、認証なし(誰でもアクセス可)で作ります。手軽に動きを試せますが、URL を知っている人は誰でも呼び出せます。本番では認証を付けたり、後片づけで消したりして、開けっ放しにしないことが大切です。
Lambda 関数に関数 URL を付け、ブラウザでその URL(https)を開くと、関数が作った Web ページが表示されることを確認する。
つくる構成
ブラウザが関数 URL にアクセスすると、Lambda 関数が動き、その場で作った HTML(ページの中身)を返します。ブラウザはそれを受け取って、ページとして表示します。
要件
以下の要件を満たし、ブラウザで関数 URL を開いてページが表示されることを確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | Lambda 関数を 1 つ作成する。ランタイムは Python(最新版でよい)。関数名は web-page-function(例)。 |
| 3 | 関数のコードを、本文のサンプル(HTML のページを返す)に置き換えて保存(デプロイ)する。 |
| 4 | 関数に 関数 URL を作成する。認証タイプは学習用に NONE(認証なし)とする。 |
| 5 | 発行された関数 URL(https)をブラウザで開き、関数が返した Web ページが表示されることを確認する。 |
構築の進め方
「関数を作る → ページを返すコードを貼る → 関数 URL を付ける → ブラウザで開く」の順に進みます。コードは貼り付けるだけ。意味は 1 行ずつ説明します。
-
リージョンを合わせ、Lambda 関数を作る
リージョンが東京であることを確認します。
Lambdaコンソールで「関数の作成」→「一から作成」を選び、関数名web-page-function、ランタイム Python(最新版)で作成します。 -
ページを返すコードを貼り付けて保存する
「コードソース」のエディタの中身をすべて消して、次のコードを貼り付け、「Deploy(デプロイ)」を押して保存します。
ざっくり言うと:アクセスされたら、簡単な Web ページ(HTML)を作って返すプログラムです。(細かい意味は、コードの下で 1 行ずつ説明します)
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 の大切なルールです。貼り付けた字下げを崩さないようにしましょう。
-
関数 URL を作成する(認証なし)
関数の画面で「設定」タブ →「関数 URL」→「関数 URL を作成」を開きます。認証タイプで
NONE(認証なし)を選び、作成します。すると、https://……lambda-url.ap-northeast-1.on.aws/のような URL が発行されます。認証タイプ
NONE(認証なし)誰でもアクセスできるAWS_IAM署名付きリクエストのみ許可↳ブラウザからそのまま開けるよう、学習用に NONE を選びます
NONE を選ぶ意味NONEは「認証なしで、誰でもアクセスできる」設定です。学習中はすぐ試せて便利ですが、URL を知っている人は誰でも呼び出せる状態になります。確認が終わったら、後片づけで必ず削除しましょう。 -
ブラウザで関数 URL を開いて確認する
発行された関数 URL をコピーし、ブラウザのアドレス欄に貼り付けて開きます。「こんにちは!」の見出しと、説明の段落が表示されるはずです。これで、ブラウザからアクセスされたときに関数が動き、ページを返す仕組みができました。
URL は https で始まる関数 URL は最初から
https(暗号化された通信)になっています。自分でサーバーや証明書を用意しなくても、安全な通信で配信される点も便利なところです。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「<h1> などの記号が、そのまま画面に出てしまう」
ブラウザに「これは HTML です」と伝えられていない可能性があります。①headers の Content-Type が text/html になっているか、②コードを変えたあとに Deploy で保存したかを見直しましょう。Content-Type の指定がページ表示のカギです。
「Forbidden などのエラーで、ページが出ない」
①関数 URL の認証タイプが NONE になっているか(認証ありだと、ブラウザでそのまま開いても拒否されます)、②URL を最後まで正しくコピーできているかを確認しましょう。コードの間違いでエラーになっている場合は、Lambda の「モニタリング」やログにエラー内容が出ます。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。Lambda コンソールとブラウザを開いて、次を順に確かめましょう。
- 「関数」一覧に
web-page-functionがあり、ランタイムが Python になっている。 - 「設定」→「関数 URL」に、発行された URL が表示され、認証タイプが
NONEになっている。 - コードが Deploy 済み(変更が保存されている)。
- ブラウザで関数 URL を開くと、「こんにちは!」の見出しと段落のページが表示される。
- その URL が
httpsで始まっている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- 「テストボタンで動かす」のと「関数 URL で動かす」のとでは、どんな違いがあるでしょうか。関数 URL を付けると、何が新しくできるようになったかを考えてみましょう。
ヒント
テストボタンは自分(管理者)だけが押せる動かし方です。関数 URL を付けると、ブラウザや他の人が「外から」アクセスして動かせるようになります。「自分だけ」から「外からも」へ広がった、という観点で考えてみましょう。 - 今回は認証タイプを
NONE(誰でもアクセス可)にしました。手軽な反面、どんな注意が必要でしょうか。開けっ放しにしておくと、どんなことが起こりうるか考えてみましょう。ヒント
URL を知っている人は誰でも呼び出せるので、意図しない大量アクセスや、見せたくない処理を実行されるリスクがあります。学習では便利でも、本番では認証を付けたり、使い終わったら削除したりする必要がある、という観点で考えてみましょう。 - 今回のページは、いつアクセスしても同じ「こんにちは!」でした。アクセスのたびに内容が変わるページ(例:今の時刻を表示する、アクセスした人ごとに違う表示にする)にするには、プログラムをどう変えればよさそうでしょうか。
ヒント
関数は実行のたびに動くので、その中で「今の時刻を調べる」「渡された情報を見る」といった処理を加えれば、毎回違う結果を返せます。固定の文字を返す代わりに、その場で計算した結果をhtmlに入れる、というイメージで考えてみましょう。
後片づけ
関数 URL は「認証なしで誰でもアクセスできる入口」です。学習が終わったら、開けっ放しにせず片づけましょう。
- 関数 URL を削除する:関数の「設定」→「関数 URL」で、作成した URL を削除します。これで外からのアクセス口が閉じます。
- 関数を削除する:使わない場合は、Lambda コンソールの「関数」一覧で
web-page-functionを選び、「アクション」→「削除」で消します。
まず関数 URL を閉じる
認証なしの関数 URL を残したままにすると、誰でもアクセスでき、想定外の呼び出しにつながることがあります。学習を終えたら、関数 URL を削除するか、関数ごと削除して、開けっ放しにしないようにしましょう。
コストに関する注意: Lambda は、関数が呼び出されて動いた回数と時間に応じて課金されます(毎月かなりの回数・実行時間までの無料利用枠があり、学習での数回〜数十回のアクセスはほぼ無料の範囲です)。関数 URL を付けること自体に追加料金はかかりませんが、認証なしの URL を公開したまま放置して大量にアクセスされると、その分の実行が課金対象になりえます。気になる場合は、上の「後片づけ」で関数 URL と関数を削除しておきましょう。最新の料金は AWS の公式料金ページで確認してください。