ありログ

日常など個人的なことを投稿

【旅行&フルマラソン】あおもり桜マラソン2026に参加してきました

2026年4月19日に開催されたあおもり桜マラソンに出場してきました!

初のフルマラソン参加です!(去年は函館でハーフマラソンに参加)

マラソンと合わせて観光も楽しんできたのでその記録を残します

■ 1日目:移動と温泉

新幹線で東京から新青森へ移動!

新青森に到着するタイミングでちょうど青森行きの電車に乗り換えられそうだったので、爆速で乗り換えし、新青森→青森→浅虫温泉と移動。

浅虫温泉に到着。

旅館にチェックインしましたが、そこで夕食なしのプランにしていたことを思い出す。

チェックイン後、地元の食堂(やっちゃん)に入り、生姜焼き定食を注文。

生姜焼き定食

優しいお味。

浅虫温泉周辺で夕暮れ以降までやっている飲食店は少ないのでありがたい・・・


夕食後は温泉に入り、その後はお酒も堪能します。

宿の向かいにクラフトビールの店があったので一杯だけ・・

(マラソン前なのに飲んで大丈夫か?という思いは旅行したら消え失せます。)

残光(スタイルはゴールデンエール)

ビールを飲んだ後、さらにラウンジで梅酒や日本酒(亀吉)などを少し飲みつつゆったり・・。

三味線の生演奏もあり、「青森に来たな」という感じがして楽しめました!


■ 2日目:マラソン前日・観光と食事

朝はバイキング。

ホテルの朝食バイキングといえばいろいろありますが、イカメンチやねぶた鍋が美味しかったです!

写真は撮ってませんが、なんだかんだで朝食バイキングが旅行中食べたもので一番美味しかった気がします。

(ホテルのバイキングってテンション上がりますよね。宿泊プランにバイキングあったら絶対予約します)


チェックアウト後は水族館へ。

楽しいパフォーマンスが見られるイルカショー

ウミガメくん


昼は鶴亀屋食堂のマグロ丼

マグロ丼 小 (マグロ15枚 / 3300円)

丼からはみ出るほどのビジュアルはインパクトがすごい!

肉厚なマグロを十分堪能することができました。

(ちなみにご飯は酢飯ではなく温かいご飯でした)

ウニ丼もあってそちらも気になりました。(新鮮なウニなんてなかなか食べられないですからね)


昼食後は青森駅に移動し、ワ・ラッセでねぶた展示を見る。

立体的な造形はかなり迫力があり、繊細な技術の集大成であることを感じさせます。(昔はロウソクで照らしていたと知り、火事とかにならないのかなと心配したり・・)


夜は煮干しラーメン。

昔地元のお店で食べた煮干しラーメンは濃厚なラーメンでしたが、青森の煮干しラーメンはあっさりさっぱりとしています!

■ 3日目:マラソン当日

朝5時起床し、糖質多めの朝ごはんを摂る。

(イギリストーストとあんぱん、青森のリンゴジュースなどを摂取)

その後送迎バスに乗るために新青森駅まで移動し、8時前に会場へ到着。

東京では桜はとっくに散っていましたが、青森ではまだ桜が咲いていて、春を2度堪能できました。

ブロックごとに指定された集合場所で待機していましたが、4月の青森はまだ寒い!(この時間はだいたい11度くらい)

開会のアナウンス時にも各自でアップしている人がちらほらいて、自由な雰囲気を感じさせる青森マラソン。


レース開始!

前半は抑えめ、中盤でペースを維持し、後半で粘るというイメージでスタート。

走り始めてすぐにトイレに行きたくなりましたが、21km地点で一度済ませたことで、その後は安心して走れました。我慢しないことは大事。


途中からサブ4.5のペースランナーに合わせて走る形に。

もともとは5時間以内を目標にしていましたが、状況的にもう少し上を狙えそうだったので、そのままついていきました。

30km以降, 公園を突っ切って桜を見ながらのラン!

レース後半になっても特にエネルギー切れは感じませんでしたが、右肩と足の痛みが徐々に強くなってきます。特に35km以降は、ほぼその痛みとの戦いでした。

40km付近から少しペースを上げてフィニッシュ。

残り2kmは距離以上に長く感じましたが、最後まで走り切ることはできました。


フィニッシュ!

大きな失速もなく、安定して走り切れました!

ゴール後に持参してきたイギリストーストを貪り、「うめぇ〜」となりました。

甘いジャリジャリがレース後の脳みそにダイレクトアタックしてきます

これにコーヒーがあれば最高。フィニッシュ会場で焼いたイギリストーストとコーヒーを販売すれば売れるのではないかと思いました。


その後は青森まちなかおんせんへ。

480円で入れるうえに露天風呂や内湯・休憩スペースなども充実していました。

温泉と外気浴でしっかりリフレッシュできました。

館内食堂でいただいたホタテの味噌焼き定食


■ 感想

マラソンと旅行のセットは良いリフレッシュになりました!

また、初めてのフルマラソンでしたが、案外あっさりと完走できました。

そして走った後のご飯はやっぱりうまいですね。いつも朝ランニングしてから焼きたてのパンと淹れたてコーヒーを食すことをモチベーションにしているので、これからも走ることは続けようかなと思います。

(なお、走った翌日以降左足の痛みが続いているのでランニングは控えております。早くまた走りたい・・)

またマラソン旅行したいと思います!フルマラソンはちょっと体への負荷が大きいので次はハーフマラソンにするかも・・。

【100kmウォーキング】Tokyo Xtreme Walk 100に出場してきました

10/25-26に開催されたTokyo Xtreme Walk 100というイベントに出場してきました!

www.asahi.com

神奈川の小田原から東京の有明まで100kmを26時間以内に歩くという狂気的なイベントです。

会社の同僚に誘われて軽い気持ちでエントリーしましたが、結構ハードでした。本記事では完走した感想などを綴っていきます

持ち物

  • ランニング用のリュック (U-Makesというブランドが出している10Lのもの)
  • 食料 (デーツ, 羊羹, アーモンド, ボンタンアメ, チョコレート)
  • 替えの靴下 2セット (※道中でさらに2セット買い足しました)
  • 100均のレインコート
  • タオル
  • モバイルバッテリー
  • ヘッドライト(大会参加時に必須)
  • ビニール袋

小田原からスタート!

朝の8時に小田原に集合し、大会が始まりました。

小田原城を拝んでからのスタート

朝から雨が降っている上、翌日までずっと雨が降り続けるという予報もあり先が思いやられる気分でしたが、天候に関係なく大会は始まりました

雨との戦い

長時間のウォーキングにおいて、足が雨で濡れてしまうのは避けたかったのですが、スタート早々靴の中がびしょ濡れになりました。

ビニール袋を靴に被せて対策しましたがすぐ破けて防御不能になってしまいました...

道中でコンビニに寄ってポリ袋を購入し、靴の中に二重で仕込んで内部から足を防御する作戦に変更しました。

これによって1, 2時間ほどは濡れずに耐えましたが、結局長時間歩いてると破れて浸水します。

完全に浸水を防ぐことは一旦諦めざるを得ませんでしたが、替えの靴下を持っていたので、10~20kmごとにあるチェックポイントで毎回靴下を交換して足が濡れている状態が持続しないようにしました。(これ結構大事です!)

30km突破 〜湘南へ

そんなこんなで7時間ほど歩いて30km突破し、第2のチェックポイントまで到達しました。

小田原から湘南まで到達。あと3分の2もあるのカァ〜という気分です。もう結構足が痛い。

湘南の海(晴れてたらいい眺めだったかも)

50km突破 〜横浜へ

さらに歩いて横浜に着弾。

もうあたりは暗くなってます。雨は降ったり止んだりを繰り返してます。(ずっと止んでてくれと祈りながら歩いていました)

大会の前に練習で山手線一周 (約40km)を歩き切ったという実績があったので、半分はまあ行けるだろと思ってましたが、ここからさらに半分あるのカァ・・と言った気持ちです。

そして54km地点のチェックポイントに到着した時点ですでに22時だったので、終電近い電車に乗ってギブアップする参加者もそこそこ見かけました。

横浜の夜景 (ブレブレ)

深夜のウォーキング

横浜を出発し、夜道を駆け巡ります。

ここからは身体能力というより精神力・根性での勝負です

体は疲れていて痛む箇所があっても歩こうと思えば歩ける。そんな状態なので最後までやってみるかという意思がある限りは続けてみようと思いました。

23時半ごろには終電もなくなり、「もう歩くしかなくなっちゃったよ」という状況に。

67km地点のチェックポイントにはカップ麺が用意されてました。こんな極限の状態で食べるカップ麺は美味いだろうなぁと思いつつも、時間ギリギリなので、手持ちのデーツとアーモンドを貪り、替えの靴下に履き替え、15分程度で再び歩き始めました。

ずっと動き続けているので眠気は感じなかったのですが、頭は働いてなかったので無心で歩き続けるマシーンと化してました。

神奈川を抜け、東京へ

そんなこんなで夜通し歩き続け、横浜を抜け、川崎を超え、東京へ到着...。大田区・蒲田に到着した時点で夜は明けていました。

品川区に突入し、朝7時前に86km地点・最後のチェックポイントに到達しました。

なんと最終チェックポイントには無料の鍼灸サービスが用意されていました!

しかし時間ギリギリということもあり今回は断念。手持ちの食料を貪り、最後の靴下に履き替え、そそくさと出発します。

ついにゴール!?

最後は品川を抜け、新橋・汐留を突っ切って、有明までの橋を渡ってフィニッシュです。

一般の歩行者の歩行ペースに合わせるだけでも相当な気合いが必要なレベルで疲労が蓄積されていましたが、最後の力を振り絞りゴールしました。

ここまで長かった・・

記念に一枚

記録は25時間48分!ギリギリですね。。。

感想

6月に参加したハーフマラソンよりも断然過酷でした。26時間という拘束時間の長さが辛く、体力より精神力の勝負だなと感じました。

それに加え、雨で足がふやけるなどの身体ダメージが蓄積されやすい状態もあったので、難易度が高まったように感じました

靴下の替えと休憩地点での糖分補給は大事ですね。これが無ければゴールできなかったかも。

とりあえずゴールできたので達成感は得られました!(一回参加したらもう満足かも・・)

また別の機会に違ったイベント(フルマラソンとか?)に出ようかなと思います。その時はまだブログUPするのでよろしくお願いします!

函館で人生初・ハーフマラソンに挑戦してきました

蒸し暑い日が続いていますが、いかがお過ごしでしょうか。

6月末に観光も兼ねて函館マラソンに参加してきました。

ジムに行ったりランニングをしたり、個人的に運動を継続的にやってきてはいますが、何かしらの大会に出場する経験は今までありませんでした。

そこで今回マラソンに参加してみようと思い、今回函館マラソンに出場してみました!

いざ21km!

ラソンのコース (公式サイトより引用)

会場の雰囲気

道中は応援してくれる方々がたくさんいて、温かい気持ちで走ることができました。

また、バナナの被り物やミャクミャクの格好をしている人など、ユニークな格好をしている人が多く、楽しい雰囲気も感じ取れました。(自分も何か被り物して参加したくなってきた)

途中のエイドでは羊羹やバナナをもらうことができ、エネルギーチャージして後半は一気に駆け抜けました。

記念写真

完走した感想

人生初めてのマラソンを完走して達成感・高揚感を得ることができました!

その一方で「案外あっさり走り切れたな...」とも思いました (普段練習で10~15kmを走っていたのと、完走が目標で息切れしないペース配分で走ったというのもある)

次はフルマラソンに出るか、さらに早くゴールを目指すか、新しい目標を立てた上でまたマラソン参加したいですね〜

あと、マラソン練習期間は減量していたのですが、そのせいかウエイトトレーニングで扱える重量が下がってしまった...

ウエイトトレーニングはたくさん食べて体大きくした方が有利という特性があり、マラソンとは目指す体が対極的なので、両立は難しい? (筋肉作り程度なら全然両立はできるとは思う)

一旦マラソン終了したので走る習慣は維持しつつ、筋トレもしっかりやっていきます...

あと、減量も一旦は緩めて好きなものを食べまくります!(これが楽しみ)

観光記録

3泊4日の滞在でいくつかのスポットを観光しました

大沼公園

千の風になって」の誕生の地らしい

大沼団子

ラッキーピエロ

オムライス チーズが効いてて美味しい&ボリューミー

ラッピでは食事の他、Tシャツを購入しました。またいきたい〜

グルメなど

やきとり弁当 野菜串ミックス 塩だれ

山川牧場のソフトクリーム

ホテルの朝食バイキング

ねぎ塩ラーメン

おわりに

函館観光してマラソンも完走して充実した休日を過ごせました〜

函館は彼女のゆかりの地ということもあり、彼女の知人たちと共に観光したりして楽しめました!

ラソンにまた出場したいという気持ちと北海道にまたいきたいという気持ちで満ちています

次回はもっと長めに滞在したい(マラソン終了した当日に帰宅したので)

Zennはじめました (+ 今後の技術ブログ運用について)

突然ですが、Zennをはじめてみました

zenn.dev

元々Qiitaでちょくちょく技術記事を投稿はしていたのですが、Zennの記事を見かける機会が何度かあり、こちらも利用してみようかなと思い登録してみました。 (個人的にスクラップ機能をちょっと使ってみたいと思ってる)

早速技術記事も投稿してみました

zenn.dev

ZennとQiitaの運用について

ZennとQiitaどう使い分けるんだ?と思いましたが、一旦はそれぞれに同じ記事を投稿する運用にしてみます。

GitHubでZenn, Qiitaの技術記事を管理できるみたいなので、記事内容をGit管理にして、ActionsでZenn, Qiitaに同時公開するように設定してみました

(以下記事を参考にさせていただきました)

zenn.dev

これからの技術ブログ運用方針について

2024年9月からはてなブログで技術ブログを投稿する方針で運用していましたが、個人で運用する分にはZenn/Qiitaのような技術記事に特化したプラットフォームの方が良いかなと思い、これからはそちらで技術ブログを投稿していこうと思います。

個人的に気になる技術ニュースやイベント参加ブログなどパーソナルな内容がメインのものは引き続きはてなブログの方で投稿していこうかなーと思います

また、技術以外の内容(先日投稿したエジプト旅行記)の内容も引き続き投稿していくので、はてなブログの方は個人的なアウトプットブログとして見ていただければと思いますm( )m

エジプト一人旅へ行ってきました!

8日間のエジプト旅行へ

長い休暇をとり、4/17-4/24の間にエジプト旅行へ出かけました。(久しぶりの一人旅)

旅のハイライト

1-2日目 ギザ周辺観光

カイロに着き、まず最初はエジプト考古学博物館を見学。 ツアーの団体が多くて身動きが取りづらく、エジプトは観光大国なんだと実感しました。

ツタンカーメンの展示(写真NG)を生で見れることができてよかったです。 ファラオのマスクや当時身につけていただろうアクセサリーの展示も見ることができ、古代エジプトの文明を感じることができました。

そしてギザに行ったらすることといえば...

ピラミッド観光ですね! ホテルの屋上からピラミッドを眺めたり、ピラミッドエリアから近くで見たりして十分堪能しました。 また、メンカウラー王のピラミッドに入ったりしました。(クフ王は超人気なのであえてこちらを選択)

メンカウラー王のピラミッド内部。10分で見終わる

ピラミッドを見た後はカフェでシーシャを吸い、その後は美術館でゆっくりしてました。息抜き大事。

昼食とりつつ、シーシャでゆったり

エジプト近代美術館で展示されていた作品。アラビア文字の美しさを表現している?

3-4日目 ルクソール

寝台列車でUpper Egypt(上エジプト)からルクソールへ移動。

カイロ→ルクソール行きの寝台列車

外国人のみが乗れる特別車両らしくて、料金は一人130USD! 正直かなり割高なので、寝台列車を乗るという経験を買うと考えた方が良さそうです。

感想としては意外と快適に眠れました。しかし、次行くとしたら普通に国内便で移動すると思いますw

現地の宿に到着後、宿のオーナーにツアーを紹介してもらいました。 ルクソールといえば王家の墓をはじめとした数多くの遺跡群ですが、個人でタクシーを呼んで回るのは骨が折れそうなのでツアーで回りました。

ルクソールはエジプト新王国時代の首都とされており、新王国時代のファラオに関連する遺跡を多く鑑賞しました (王家の谷、ハトシェプスト葬祭殿、アメンホテプ3世葬祭殿など)

遺跡のダイナミックさに圧倒される一方、回っていくにつれて暑さと観光客の多さでしんどさが勝るように...

ツアーは15時ごろに終了しましたが、宿の近くにルクソール神殿があるので、夕方にサクッと見に行くことにしました

夕日とルクソール神殿

翌日のエジプト4日目には気球から日の出を眺めるツアーに参加しました。 (通常100USDが相場だが、宿のオーナーの紹介で50USDに)

気球から眺める日の出とルクソール

暑さと観光客の多さと客引きのしつこさで三重にしんどいルクソール観光でしたが、気球からの眺めはひと時の癒しでした

5-6日目 アレクサンドリア

ルクソール→カイロ→アレクサンドリアをバスで移動。 早朝4時に到着し、朝から海沿いを散歩するというハードなスケジュールでアレクサンドリア観光をスタートしました(死ぬほど疲れたので次からはしません)

カイト・ベイの要塞

カイロやルクソールと違い、観光客も多くなく、気候も涼しく、客引きも多くありません(バスターミナルにはいるけど) そして地中海を眺めながら散歩もできるので、エジプト旅行の癒しといったところです

Kebda Awlad Alflahというお店で食べたレバーサンドイッチ

地中海の眺め

7-8日目 カイロ

カイロに戻り、残りはゆったり過ごすこととしました。 本当はスエズ運河を見に行くためにポートサイドへ行こうとしたのですが、アレクサンドリアから行こうとして間違ったミニバンに乗ってしまい... その後いろいろと案内を受けるもマネーマネーと言われて気疲れしたので、「最終日も近いし、もうあまり冒険せずゆったり過ごすか〜」と思いカイロに戻りました。

カイロ最大のショッピングモール Citystars Mall

デーツを食べて一休み 大粒でみずみずしく、シュガードーナツのような甘さ

カイロ最後のディナー(Fasahet Somaya) 相席した南アフリカ出身の旅人と旅の話で盛り上がる

エジプト旅行は精神修行

エジプトはとにかく暑い上に、チップと称してお金を請求されたり客引きを受けることが多く、なかなかタフな旅になります。 特にギザやルクソールでは、目があったら勝負を仕掛けてくるポケモントレーナーのごとく、「案内しようか?」「ラクダのらないか?」と話しかけられます。 (ピラミッドまでの道中では、あまりにも話しかけてくる強敵が多いのでチャンピオンロードと名付けてました)

配車アプリやバスの利用でもお金を要求されることがあるため、気が抜けません。 大体5~10EGPを渡しておけば良いのですが、細かいお金を持ち合わせていないと大きめの金額を渡さなければならなくなる場合もあります...

不意にマネーを求められる場面が多すぎてこんなメモまで残してたw

また、ショッピングモールのATMでキャッシングをしようとしたところ、クレジットカードが出てこないままATMがフリーズするトラブルも発生しました。 モールの従業員に協力を仰ぎ、なんとかクレジットカードを救出しましたが、ヒヤッとしました...

多すぎる客引きや不意なマネー要求、トラブルが続き、なかなか気疲れするイベントの多い旅でしたが、「エジプト旅行はこういうものだ、一種の精神修行だ」と考えることにしました

なんだかんだで楽しめた

そんなエジプトですが、ピラミッドや数多くの遺跡を見たり、気球ツアーや地中海沿いの散歩を楽しむことができ、刺激に満ちた旅でした。

道中では一人旅をしている人と何人か出会い、これまで行った旅について話したりすることもできました。これも旅の醍醐味ですね!

8日間滞在しましたが、個人的にはまだまだ見たいところがあり、また行くとしたらシワなどでの砂漠ツアーやスエズ運河クルーズなども体験してみたいと思いました。 (カイロやルクソールの喧騒をまた体験したいかと言われたら、苦い笑みが出てきそうですが...)

エジプトにはリゾート地も多くあるので、落ち着いた場所でリフレッシュしたい方はナイル川沿いよりも地中海や西方砂漠のツアーに行くと良いかもしれません。 (シワなどの西方砂漠エリアには穏やかなベルベル系の人が暮らしており、カイロやルクソールとは違った雰囲気を楽しめるかも?

旅のふりかえり

よかったこと

  • 地球の歩き方」がすごく役に立った (レストランや宿の詳細情報・地図などをオフラインでも確認できる)
  • ツアーを現地で手配したことで、ネットでの申し込みよりだいぶ安く抑えられた
  • バルコニーからピラミッドの見えるホテルがすごくよかった(Life Pyramids Inn)
  • 24hサポート付きのeSIMを利用した
    • 現地調達のSIMの方が安いが、通信トラブル発生時にサポートを利用して解決できたので、24hサポートは心強い

次はこうしたい

  • 旅先の言語をある程度学習してから旅に臨む
    • Google翻訳を使えばなんとかコミュニケーションは取れるが、言葉がわかったほうが絶対楽しい

おわりに

エジプトではブログで紹介しきれないくらい色々なものを見たり、エピソードがあったりするのですが、刺激的で「行ってよかった」と思えるような旅をすることができました。

また旅をしたらブログで紹介したいと思います..!

CloudFrontで配信しているWebサイトへのアクセス時にCognito認証を利用してみる

Cognitoとは

ユーザープールを作成してマネージドに認証システムを実現するソリューションです。

aws.amazon.com

CloudFront + Cognitoを組み合わせたユースケース

CloudFrontで配信している静的Webサイトに対してBasic認証のような形でCognito認証をリクエスト時に噛ますことができます。

ざっくり構成図

Basic認証に比べて実装の手間が少しかかる一方、認証情報の暗号化や多要素認証などといった機能があるので、セキュリティ面で優位であると考えられます。 (Basic認証だと平文で認証情報を送信するのであまりセキュアではない)

気になるお値段は?

最初の10000ユーザーは無料利用枠の範囲内。

社内限定でサイトを一般ユーザーから非公開にするために今回のようなユースケースでCognitoを利用する場合、そこまで料金がかからないと考えられます。

1.Amazon Cognito またはソーシャル ID プロバイダー経由で直接サインインするユーザー向けに、Amazon Cognito ユーザープールには、アカウントまたは AWS 組織ごとに 1 か月あたり 10,000 人の月間アクティブユーザー (MAU) の無料利用枠が用意されています。この無料利用枠は、ユーザープールを Lite ティアまたは Essentials ティアのいずれかに設定しているお客様に適用されます。Plus ティアには無料利用枠はありません

料金 - Amazon Cognito | AWS

Cognito環境作成

Cognitoによる認証環境を作成する際、以下のリソースを作成する

  • ユーザープール
    • Cognitoによる認証・認可で利用するユーザー情報を格納するディレクト
    • 認証時に利用するパラメータの設定やMFA等認証方法の設定も行える
  • アプリケーションクライアント
    • 作成したCognitoリソースによる認証を利用するアプリケーションの連携設定等を行う
  • ドメイン

Terraformで作成する場合、以下のように記述します

resource "aws_cognito_user_pool" "default" {
  name = "user-pool"

  admin_create_user_config {
    allow_admin_create_user_only = false
  }

  alias_attributes         = ["email", "preferred_username"]
  auto_verified_attributes = ["email"]

  password_policy {
    minimum_length                   = 8
    require_uppercase                = true
    require_lowercase                = true
    require_numbers                  = true
    require_symbols                  = false
    temporary_password_validity_days = 7
  }

  schema {
    name                = "email"
    attribute_data_type = "String"
    mutable             = true
    required            = true
  }

  schema {
    name                = "preferred_username"
    attribute_data_type = "String"
    mutable             = true
    required            = false
  }

  schema {
    name                = "name"
    attribute_data_type = "String"
    mutable             = true
    required            = true
    string_attribute_constraints {
      min_length = 1
      max_length = 100
    }
  }
}

resource "aws_cognito_user_pool_domain" "default" {
  domain       = "user-pool"
  user_pool_id = aws_cognito_user_pool.default.id
}

resource "aws_cognito_user_pool_client" "default" {
  name         = "user-pool-client"
  user_pool_id = aws_cognito_user_pool.default.id

  callback_urls                = [var.cloudfront_distribution_url]
  supported_identity_providers = ["COGNITO"]

  allowed_oauth_flows                  = ["code"]
  allowed_oauth_flows_user_pool_client = true
  allowed_oauth_scopes                 = ["openid"]
}

Lambda@Edgeの作成

Lambda@EdgeでCloudFrontのディストリビューションへのリクエスト時にCognitoの認証画面を呼び出すようにします。 cognito-at-edgeという便利なnpmのライブラリがあるのでそれをpackage.jsonに記載します。 (ユーザープールのID等を環境変数として設定したい場合、お好みでdotenvを記載してください)

{
  "dependencies": {
    "cognito-at-edge": "^1.5.3",
    "dotenv": "^16.4.7"
  }
}

関数(index.js)には以下のコードを記述するだけでOKです!

const { Authenticator } = require('cognito-at-edge');
const Env = require('dotenv').config();

const authenticator = new Authenticator({
  region: 'ap-northeast-1', // user pool region
  userPoolId: process.env.USER_POOL_ID, // user pool ID
  userPoolAppId: process.env.USER_POOL_APP_ID, // user pool app client ID
  userPoolDomain: process.env.USER_POOL_APP_DOMAIN, // user pool domain
  cookiePath: '/',
});

exports.handler = async (request) => authenticator.handle(request);

作成した関数はCloudFrontディストリビューションのビューワーリクエストに紐づけてあげればOKです。

アクセスしてみる

CloudFrontに作成したLambda@Edgeを紐づけた上で、アクセスを試みます。

ログイン画面

サインアップ画面

ログイン・サインアップ用の画面HTMLを自分で作らなくても表示されるようになりました!

サインアップ時に認証コードがメールアドレスに送られてくるので、それを元にユーザー作成・ログインをすると・・

Vite + Reactで構築したサンプルWebサイト

オリジンに設定したコンテンツが表示されるようになりました!

終わりに

Lambda@EdgeとCognitoを組み合わせることで簡単にCloudFrontで配信しているWebサイトに対して認証機能を持たせることができました。

Cognito自体は他にもユースケースがあり、クライアントアプリケーションに埋め込んだり、JWTを用いたクライアントとサーバーサイド間の認証情報の受け渡しやサードパーティ認証も実現可能です。

機会があったらまた別のユースケースを紹介しようと思います。

AWS Lambdaの「予約された同時実行数」について

概要

AWSのLambdaには「予約された同時実行数」という設定項目があります

Lambda関数の同時実行数に制限をかける機能となっているのですが、それを設定しておくことでどんなメリットがあるのか、備忘録として残しておきます

同時実行数を制限するメリット

他のLambda関数とのリソース競合・スロットリングを防ぐ

一つのAWSアカウントにおける1リージョンに対してLambda関数の同時実行数は1000に制限されています。

あるLambda関数の処理が同時に1000件実行されてしまうと、他のLambda関数が実行できなくなるといった問題(スロットリング)が起こってしまうので、それを防ぐために関数に同時実行数制限を設定するメリットがあります。

(AWS側の設定で同時実行数を調整するのではなく、同時実行数を減らすように処理の要件を考えることも重要)

(制限緩和申請を行うことで同時実行数を1000より大きくすることも可能)

コストや負荷が過剰に発生することを防ぐ

SQSやAPI Gatewayなどをトリガーに設定している場合、過剰なリクエストやバグのあるソースコードによる無限ループが発生する可能性も考えられます。

その場合、Lambda関数が過剰に呼び出され、後続処理に大きな負荷がかかったり、実行数が増えることによるコストの増加といったリスクが考えられます。

同時実行数の制限を行うことで、そのようなリスクを最小限に抑えることができます。

同時実行数を設定してみる

AWS Lambdaのコンソール上の「設定 > 同時実行と再帰の検出」から同時実行数を変更することができます。

 

Terraformの場合はreserved_concurrent_executionsの数値を設定すれば同時実行数を調整できます。


resource "aws_lambda_function" "default" {
  function_name                  = "test-function"
  filename                       = data.archive_file.default.output_path
  source_code_hash               = data.archive_file.default.output_base64sha256
  runtime                        = "nodejs22.x"
  role                           = aws_iam_role.lambda.arn
  handler                        = "index.handler"
  reserved_concurrent_executions = 1 # 同時実行数を1に設定
  timeout                        = 60
}

同時実行数を0にすると…

同時実行数を0にした状態で関数のテストを実行すると以下のエラーが出ます。

関数を削除せずに一度も呼び出せない状態にできるので、一時的に関数を無効化したい場合に0に設定(もしくはLambdaのコンソール画面の「スロットリング」を押下)しておくとよさそうですね

感想

実務でLambda関数のスロットリングを観測することがしばしばあったので、同時実行数の制約・設定を意識してLambda運用をしていこうと思いました。

また、同時実行数が増えすぎないように、Lambda関数自体の処理時間・実行回数にも気を配る必要があるなと思いました

参考

docs.aws.amazon.com