ラベル aws の投稿を表示しています。 すべての投稿を表示
ラベル aws の投稿を表示しています。 すべての投稿を表示

2026年9月15日火曜日

本人にしか見せない画像を、CDN 越しに届ける

本人にしか見せない画像を、CDN 越しに届ける
Engineering Blog

本人にしか見せない画像を、CDN 越しに届ける

モバイルアプリのアイテム登録機能に、CloudFront Signed Cookie を使った画像配信基盤を導入した話。設計と実装、そして途中で踏んだ3つの地雷について書きます。

Rails / AWS S3 / CloudFront Backend & Platform 読了時間 目安 8分

モバイルアプリでは、アイテムを写真つきで登録すると、ポイントや保証の管理に使えるようになっている。今回、この「アイテム写真」と「購入証明書の写真」を、これまでのような単純な公開URLではなく、本人だけがアクセスできる形で配信する基盤を作り直しました。この記事では、その設計と、実装中に遭遇した細かいけれど厄介な問題についてまとめます。

01背景と要件

これまで、アイテム画像はクライアントが用意した URL 文字列をそのまま DB に保存するだけの、ごく単純な仕組みでした。しかしアプリの機能拡張にともない、次の要件が持ち上がりました。

Requirements
  • → 画像はサーバー経由でアップロードするクライアントから直接ストレージを叩くのではなく、アプリサーバーが受け取って保存する形にしたい(バリデーションと保存先を一元管理するため)。
  • → ユーザー自身の画像しか見えないアイテム写真・購入証明書は個人情報に近い。URLを知っていれば誰でも見られる状態は避けたい。
  • → 配信はCDN経由にするS3から直接返すのではなく、CloudFrontでキャッシュ・配信したい。ただし「認証つきCDN配信」と「本人限定」を両立させる必要がある。
  • → モバイル側の実装コストを抑えるリクエストのたびに署名付きURLを都度発行するのではなく、ログインしてしまえばあとは普通に画像を読み込めるようにしたい。

「本人限定」と「CDN配信」を両立させる方法として選んだのが、CloudFront の Signed Cookie です。署名付きURLだと画像1枚ごとに個別の署名が要りますが、Signed Cookie ならログイン時に一度発行しておけば、あとはブラウザ(アプリ)が自動的にCookieを送ってくれるので、モバイル側の実装がシンプルになります。

02アーキテクチャ

全体は「アップロード」と「配信」の2つの流れに分かれます。どちらも同じ非公開S3バケットとRailsアプリサーバーを経由しますが、認証の仕組みが異なります。

LANE 1 — アップロード LANE 2 — 配信 iOS アプリ URLSession app-server Rails API ImageUploadService CloudFront Signed Cookie 検証 S3 非公開バケット ① POST /items(multipart: image) ② image_url + Set-Cookie put_object ③ GET 画像URL(Cookie同梱) 画像 / 403 署名検証OKの時だけ originへフェッチ
図: アップロード(レーン1)と配信(レーン2)は同じS3バケットを共有するが、認証の仕組みは別。配信側の検証はCloudFrontのエッジで行われ、アプリのコードは一切関与しない。

ポイントは、Signed Cookie の検証ロジックはアプリケーションコードのどこにも存在しないということです。Railsが担うのはCookieを「正しく発行する」ことだけで、検証はすべてCloudFrontのエッジ側で完結します。裏を返すと、発行時にちょっとでも間違った値を作ってしまうと、それを検出できるのは実際にCloudFrontにリクエストが飛んだ瞬間だけ、ということでもあります。これが後述するハマりどころに直結します。

Cookieはいつ発行するか

Signed Cookie は次の2つのタイミングで発行・再発行します。

  • ログイン時 — 毎回無条件に新規発行する
  • 認証つきAPI呼び出し時 — リクエストに3種類のCookieが揃っていない場合だけ、その場で再発行する(アプリの再インストールでCookieだけ消えた場合の保険)

有効期限は10年という、一見雑に見える値を設定しています。アプリ側のログイントークン自体に有効期限の概念が無いため、それに合わせて「実質失効しない」十分に長い値にした、という判断です。

03実装したこと

アップロードAPIは、これまでの「クライアントがURL文字列を送る」方式から、「クライアントが画像バイナリそのものを multipart で送る」方式に変更しました。サーバー側は受け取った画像を検証してS3に保存し、DBには完全なURLではなくS3キーだけを保持します。レスポンスを組み立てる際に、このS3キーをCloudFront配信URLへ変換します。

users/{user_id}/items/{item_id}/case/{timestamp}-{random}.jpg
users/{user_id}/items/{item_id}/purchase_certificate/{timestamp}-{random}.jpg

DBに完全なURLではなくキーだけを持たせたのは、配信ドメインを後から変更しやすくするためです。実際、開発環境と本番環境で配信ドメインが異なるため、この一段のクッションが効いています。

04ハマったところ

設計自体は素直でしたが、実装の過程で3つ、地味に厄介な問題にぶつかりました。いずれも「ローカル開発環境には本物のCloudFrontが無い」ことが発見を遅らせた共通点です。

全画像 403

ワイルドカードは「カスタムポリシー」でないと効かない

問題Signed Cookieには「既定ポリシー(canned policy)」と「カスタムポリシー(custom policy)」の2種類があります。既定ポリシーはCookieに有効期限しか含まず、CloudFront側が実際にリクエストされたURLからポリシーを再構築して検証します。今回のように users/{user_id}/* というワイルドカードを含むリソースを許可したい場合、既定ポリシーでは検証時に組み立て直したURLと署名対象が一致せず、問答無用で403になります。

気づいたきっかけローカル開発環境には実物のCloudFrontが存在しないため、この不具合はテストでは一切表面化しませんでした。実際にAWS SDKのCookie発行ロジックを手元で動かし、生成された署名を実際に検証してみて初めて気づく類の問題です。

解決ポリシーJSONを自前で組み立てて明示的に渡す、カスタムポリシー方式に切り替えました。発行されるCookie名も変わる(CloudFront-Expires → CloudFront-Policy)ため、関連するテストやドキュメントもあわせて追随させています。

署名が壊れる

フレームワークがCookieの値を勝手にURLエンコードしていた

問題CloudFrontの署名付きの値は、通常のBase64ではなく+ = / をそれぞれ - _ ~ に置き換えた独自形式です。ところがRailsのCookie機構は、値をSet-Cookieヘッダーに書き出す際、内部でURLエンコード処理を通しており、この~が%7Eに変換されてしまっていました。

送出された値
Signature=abc~def~ghi
実際にブラウザが保持する値
Signature=abc%7Edef%7Eghi

ブラウザ(アプリ)はSet-Cookieの値をそのままのバイト列として保存・送信するだけなので、%7Eは~には戻りません。CloudFront側はこの3文字を「1文字の~」として解釈できず、署名データの一部を読み違えて検証に失敗します。

気づいたきっかけログインもアイテム登録も普通に成功し、返ってくる画像URLも一見正しく見えるため、切り分けが非常に難しい壊れ方でした。実際にレスポンスの生ヘッダーを見て、値の中に%7Eが複数含まれていることに気づいたのがきっかけです。

解決RailsのCookie機構(フレームワークによる自動エスケープ)を経由せず、Set-Cookieヘッダーの文字列を自前で組み立てて直接レスポンスに載せるように変更しました。値自体はエスケープが不要な文字種(英数字と- _ ~のみ)だったため、素通しで問題ありません。

型が壊れる

multipartはネストしたJSONを運べない

問題購入証明書登録APIでは、画像とあわせてAI判定結果(金額や店舗名などを含むJSONオブジェクト)も送る必要があります。しかし multipart/form-data は「名前=文字列」しか運べないため、ネストしたオブジェクトを送ろうとすると、数値が文字列になり、nullが空文字になり、空配列がキーごと消える、という劣化が起こります。

ブラケット記法(NG)
ai_result[price]=1200
ai_result[dates][]=
JSON文字列化(OK)
ai_judgment_result=
{"price":1200,"dates":[]}

解決ネストしたオブジェクトをブラケット記法に分解するのではなく、JSON文字列化した1つのフィールドとして送ってもらい、サーバー側でパースする方式に統一しました。型情報を保ったまま運べるうえ、クライアント側の実装もシンプルになります。

05まとめ

今回いちばん学びが大きかったのは、「検証ロジックがアプリの外(CDNのエッジ)にある」仕組みは、ローカル環境だけでは正しさを保証できないということです。3つのハマりどころのうち2つは、実際にAWSのSDKを手元で動かして署名やヘッダーを1バイトずつ確認するまで発覚しませんでした。テストが通っていても、境界の外側で何が起きているかは別の話だと痛感しました。

一方で、Signed Cookieという仕組み自体は、いったん正しく発行できてしまえばアプリ側の実装は驚くほどシンプルです。画像1枚ごとに署名付きURLを発行する必要も、モバイル側で特別なヘッダーを付け回す必要もありません。ログインという1点さえ正しく作り込めば、あとは普段どおりの画像読み込みで「本人限定配信」が実現できる。地味ですが、良い設計だったと思っています。

この基盤は現在、社内のモバイルアプリチームと連携しながら実際のクライアント実装を進めているところです。実機での検証がまとまり次第、続報を書きたいと思います。

Rails AWS CloudFront Signed Cookie S3 アーキテクチャ

2026年9月1日火曜日

「開発環境は止まっているはずなのに」— AWS Configコスト急増の犯人を追いつめた話

TL;DR

  • コスト削減のため夜間・週末に自動で止めているはずの開発環境で、AWS Configの利用料金だけが跳ね上がった
  • 「起動・停止の瞬間にコストが増える」という自然な仮説は、調査したら半分正解・半分不正解だった
  • 本当の犯人は、環境の停止処理がECSサービスの Application Auto Scaling を止めていなかったことによる、丸4日間ぶっ通しのタスク起動失敗ループだった
  • 最初の修正案もレビューで「まだ不十分」と指摘され、AWSの正式な「Auto Scalingの一時停止」機能に作り直すことになった

以下、調査の一部始終と、そこから得た教訓をまとめる。


背景

とあるWebサービスのdevelop/staging環境は、コスト削減のために夜間・週末は自動で止まるようになっている。具体的には、Lambda + EventBridge Schedulerで組んだ仕組みで、

  • ECS Fargateサービスを desiredCount = 0 にスケールダウン
  • RDS Auroraクラスタを停止
  • NAT用・踏み台用のEC2インスタンスを停止

という3点セットを実行し、平日朝に元へ戻す。よくある構成だと思う。

このスケジュールをしばらく無効化していた期間があり、再度有効化したところ、AWS Configの利用料金(Configuration Item記録件数に応じた課金)が急増した。「起動・停止イベントが増えたから、その分Configの記録も増えたのだろう」と考えるのが自然だし、実際そういう外部の事例もいくつか見つかる。

というわけで、原因を確定させ、直すことにした。

第一の仮説:起動・停止のたびにENIが作り直される

ECS Fargateをawsvpcネットワークモードで使っていると、タスクが再作成されるたびに新しいENI(Elastic Network Interface)が払い出される。これ自体はAWS::EC2::NetworkInterfaceというリソースタイプとしてAWS Configに記録される対象で、実際にいくつかのブログ記事でも「ECSタスクの頻繁な入れ替わりでConfigコストが跳ね上がった」という事例が紹介されている。

これを検証するために、調査専用の一時的なCloudTrail(管理イベントのみ、単一リージョン)を新しく作り、既存の設定には一切手を触れずに構築した。ついでにAWS Configのselect-resource-config(Advanced Query)やget-discovered-resource-counts、CloudWatchメトリクス(AWS/Config名前空間のConfigurationItemsRecorded)も使って、実際に何が記録されているかを定量的に追いかけた。

起動イベントの瞬間(数十分のウィンドウ)を見てみると、確かに記録の内訳はこうなっていた。

リソースタイプ件数比率
EC2::NetworkInterface最多約3割
EC2::SecurityGroup次点約2割弱
ECS::Service約1割強
EC2::Instance(NAT/踏み台)1割弱
その他(RouteTable/EIP/RDS等)残り

想定通り、ENI(と、それに付随するSecurityGroupやRouteTableなどの周辺リソース)が最多だった。「やっぱりこれが原因か」と一瞬納得しかけた。

ここで、地味に役立った教訓が一つ。select-resource-config(Advanced Query)は「各リソースの最新の状態」しか返さない。過去のある時点で何が記録されたかを調べようとしても、そのリソースがその後さらに変化していれば、古いタイムスタンプでの記録はヒットしない。「昨日の停止イベントを調べようとしたら0件だった」と一瞬焦ったが、原因はこれだった。過去の特定時点の記録を追うには、リソースIDを指定して履歴を直接取得できるAPI(get-resource-config-history)や、Config配信チャネル先のS3にある設定履歴ファイルを使う必要がある。

しかし、これでは説明がつかない

起動・停止イベント単体の影響は数十件程度で、確かに存在はする。しかし、Cost Explorerでコスト推移を見ると、環境が完全に停止しているはずの期間(週末含む、丸4日間)もコストが下がるどころか上がり続けていた。

もし原因が「起動・停止イベントに伴う一過性のENI churn」なら、停止直後にスパイクしてすぐ収まるはずだ。しかし実際は、停止期間中ずっと高止まりし、日を追うごとにむしろ微増していた。これは「一過性のイベント」の説明では無理がある。「別の何かが継続的に発生している」と考えるべきだった。

寄り道:見当違いの仮説を検証して捨てる

真っ先に疑ったのは、「現在Configが管理しているリソースの総数」を見たときに突出して多かった、あるレガシーなリソースタイプ(過去に別件のコスト急増の原因になったことがあるもの)だった。しかし、そのリソースタイプ単体のCloudWatchメトリクスを見ると、直近ではほとんど動きがなかった。「総数が多い」ことと「直近の変化率が高い」ことは別物だと、指摘されて初めて気づいた。仮説は却下。

次に、「Config全体の記録件数」と「ENI(EC2::NetworkInterface)単体の記録件数」を日次で比較してみると、両者はほぼ同じ形(ベースラインの約15〜18倍に跳ね上がり、その後も高止まり)をしていた。しかも比率がずっと一定(全体のうち常に2〜3割程度)。ここでようやく「ENIが本命で間違いない、ただし発生源は起動・停止イベントとは別」という当たりがついた。

犯人探し:CloudTrailで「誰が」ENIを作っているかを追う

CloudTrailでCreateNetworkInterfaceイベントのdescriptionフィールドを見ると、完全に停止しているはずの1日分の記録が、すべてECSタスクのアタッチメントを示す形式(arn:aws:ecs:...:attachment/<uuid>)だった。しかもユニークなIDが数百件並んでいて、「同じ理由で1回だけ大量発生した」のではなく「何かが延々とタスクを再作成し続けている」ことを示していた。

不思議なことに、明示的なRunTask呼び出しは1日たった数件(既知の定期実行ジョブ分だけ)しかなかった。ここで学んだのが、ECSサービスがスケジューラ経由で内部的にタスクを再配置する場合、RunTaskではなくTaskCreatedという別の管理イベントとして記録されるということ。実際にTaskCreatedイベントの件数を見ると、RunTaskの数十倍あった。

ここから、作成されたENIの「サブネットID」と「セキュリティグループID」の組み合わせを集計し、既知のリソース(AZごとに2つのサブネットに分散配置されるのが通例)と突き合わせることで、犯人サービスを絞り込んだ。最終的にaws ec2 describe-security-groupsでセキュリティグループ名を引いて、内部向けAPIサービスであることが判明した。

根本原因:Auto Scalingが停止と綱引きしていた

該当サービスのdescribe-servicesのイベントログを見て、ようやく全貌が見えた。

(service ...) was unable to place a task. Reason: ResourceInitializationError:
unable to pull secrets or registry auth: unable to retrieve secret from asm:
There is a connection issue between the task and AWS Secrets Manager.
... context deadline exceeded.

タスクが起動すらできず、コンテナ定義に紐づいたSecrets Managerのシークレット取得でタイムアウトしていた。原因はシンプルで、環境停止時にNAT用EC2インスタンスも一緒に止めているため、プライベートサブネットからインターネット(Secrets Managerのパブリックエンドポイント)へ抜ける経路が失われていたからだ。

ではなぜタスクを起動しようとしていたのか。該当サービスにはApplication Auto ScalingがMinCapacity=1で登録されており、環境停止処理がこのAuto Scalingの設定に一切触れていなかった。停止処理はUpdateService(desiredCount=0)でサービスを一旦0にするが、Auto Scalingは自分の管理範囲(Min1〜Max2など)を守ろうとして、定期的にdesiredCountを1へ戻そうとする。

  • Auto Scalingがタスクを1つ起動しようとする
  • NATが止まっているのでSecrets Manager取得に失敗し、約13分でタイムアウト
  • ECSが即座に次のタスクを試みる
  • 以下、環境停止期間中(今回のケースでは最大4日弱)ずっと、13〜27分間隔で繰り返し

サービスのイベントログのタイムスタンプを丹念に追うと、この失敗ループは環境の起動処理でNATが復旧した直後にピタリと止まっていた。ここまで来ると、もう疑いようがない。

一度目の修正:レビューで「まだ足りない」と言われる

最初に考えた修正は素直なものだった。停止時にAuto ScalingのMinCapacityを0にし、起動時に元へ戻す。IAM権限もDescribeScalableTargets/RegisterScalableTargetの2つだけで済むし、実装もシンプル。コードレビューに出した。

すると、こういう指摘が返ってきた。

MinCapacityを0にするだけでは、Auto Scalingに登録済みの「スケジュールドアクション(毎日決まった時刻にMin/Maxを書き換えるアクション)」に上書きされてしまうのでは?

確認してみると、まさにその通りだった。当該サービスには「毎朝の営業開始前にスケールアウトする」「毎晩の営業終了後にスケールインする」という、Auto Scaling自体のスケジュールドアクションが別途設定されていた。これは環境の起動停止スケジュールとは完全に独立して毎日動く。つまり:

  • 環境を停止した直後の夜、Auto Scaling側の「スケールイン」アクションがMinCapacityを1に戻す
  • 環境の起動処理より前に、Auto Scaling側の「スケールアウト」アクションがMinCapacityを1に戻す(NAT起動よりも先に)

MinCapacityを直接書き換える方式では、この2つの独立したスケジュールに対して常に後出しじゃんけんで負ける構造だった。しかも、TerraformでこのMinCapacityを管理している場合、Lambdaが書き換えた値は次回のterraform applyで元に戻されてしまう(driftの元)という副作用まで指摘された。

二度目の修正:AWS標準の「一時停止」機能を使う

Application Auto Scalingには、まさにこの用途のための機能がある。RegisterScalableTargetAPIのSuspendedStateだ。MinCapacity/MaxCapacityの値には一切触れず、「動的スケーリング」と「スケジュールドアクション」の両方を丸ごと一時停止・再開できる。

# 停止時
autoscaling.register_scalable_target(
    ServiceNamespace="ecs",
    ResourceId=resource_id,
    ScalableDimension="ecs:service:DesiredCount",
    SuspendedState={
        "DynamicScalingInSuspended": True,
        "DynamicScalingOutSuspended": True,
        "ScheduledScalingSuspended": True,
    },
)

# 起動時(すべてFalseに戻すだけ)
autoscaling.register_scalable_target(
    ServiceNamespace="ecs",
    ResourceId=resource_id,
    ScalableDimension="ecs:service:DesiredCount",
    SuspendedState={
        "DynamicScalingInSuspended": False,
        "DynamicScalingOutSuspended": False,
        "ScheduledScalingSuspended": False,
    },
)

これなら、Auto Scaling側のスケジュールドアクションも含めて確実に止まるし、Min/MaxCapacityの値そのものは触らないのでTerraformとのdriftも起きない。IAM権限も変わらず同じ2つで済んだ。

あわせて、「環境起動後のサービス安定化待ちがタイムアウトした場合でも、Auto Scalingを止めたまま放置しない」ようにtry/finallyでresume処理を保証するようにした。一時停止したまま忘れられると、今度は逆に「業務時間中の正常なオートスケールが働かない」という別の障害になりかねないからだ。

教訓

  1. 「怪しいものが大量にある」と「直近悪化した原因である」は別物。総数のスナップショットだけで判断せず、時系列のレート(メトリクス)で裏を取る。
  2. AWS Configの「今のリソース状態」を返すAPIと、「過去の履歴」を返すAPIは別物。過去のある時点を調べたいなら履歴系のAPI(あるいは配信されたログファイル)を使う。
  3. CloudTrailの「明示的なAPI呼び出し」と「サービス内部の自動処理」は別のイベント名で記録されることがある。RunTaskが少ないからといって、タスクがあまり起動していないとは限らない。
  4. 「止める」処理を書くときは、それを上書きしうる自動化(Auto Scaling、他のスケジュール、外部の監視ツールによる自動修復など)が他にないか、必ず洗い出す。今回は「環境の起動停止スケジュール」と「Auto Scaling自身のスケジュール」という、独立に育った2つの自動化が噛み合っていなかったことが根本原因だった。
  5. コードレビューは通す。一度目の修正で「動くはず」と思っていたが、実際にはterraformの中身まで確認しないと見抜けない落とし穴があった。一人で完結させず、指摘をもらえる体制は大事。

似たような「開発環境の自動停止」を運用している人の参考になれば幸いです。

2026年7月23日木曜日

AWS Certified Data Engineer - Associate 合格

 

背景

前回の受験で申し込んでいたCloud Licenseの期限がまだ残っていたので、有効活用するために何か簡単そうな試験に挑戦しようと思った。

残っている試験はAssociateかSpecialtyのどちらかだが、Specialtyはまだ難しそうだった。

Data Engineerは今の仕事とはあまり縁がなさそうではあるが、一応AWS Glueを使ったことがあり、全く経験がないわけでもない。

「これも落ちたら仕方ない」という気持ちで挑戦することにした。

勉強した書籍・サービス

  • Cloud Licenseのみを利用し、分からないところはインターネットで記事を検索して学習した。

  • RedshiftやEMR関連はほぼゼロから勉強するような感じだったが、これまでのAWSの経験があるからか、それ以外は比較的スムーズに理解できた。間違えた問題の復習も2周目まで終えることができた。

  • Cloud Licenseの有料オプションが切れたタイミングで試験日を決定。もともとは金曜日に受験する予定だったが、午前中に空きがなかったため、仕方なく木曜日にした。

  • ネット上でData Engineer試験の内容をよくまとめた記事を見つけたので、最後はそれを使って復習した。しかし、読んでいると分からない内容が次々と出てきて、試験直前まで焦っていた。

受験日

  • 朝早めに家を出て、いつもの喫茶店で試験対策のまとめ記事を読みながら最後の勉強をした。

  • 試験会場で席に座ると、左斜め前の人がCCNAらしき試験を受けていた。最初は気にならなかったが、その人が考えるたびに頭に手を乗せる動作を繰り返していて、視界に入るたびに気が散ってしまった。仕方なく見えないように姿勢を変えていたが、それでも時々視界に入ってしまった。

  • 十数問を見直し対象としてチェックし、ちょうど制限時間いっぱいで試験を終えた。

結果

  • 少し自信はあったものの、点数はこれまでと同じように合格ラインを少し上回る程度だった。とりあえず合格できたので良しとしよう。

     


     

次はどうするか

  • Cloud Licenseも期限切れになったので、今度こそAWS認定試験はしばらく休もうと思う。

  • 本も読みたいが、以前から周りに「簡単だから取れる」と勧められている簿記の勉強にも挑戦してみたい。

2026年6月25日木曜日

AWS summit 2026

申し込み

5/21に社内のSlackから以下の連絡があって、「あ、今年もやるんだな」と思い、申し込みをした。

定員がいっぱいとなっておりましたExecutive Forumに関して、追加で200名分のご登録が解放となりました。
ご参加をご検討いただいていたエグゼクティブの方は、ぜひお早めに下記コードを用いてご登録ください。(おそらく今後は枠の拡大はないかと思います。)

Executive Forumが何なのか、あまりよくわからなかったが、なんとなく「一般参加よりは良いだろう」と思い、招待コードで申し込みをした。招待コードで申し込んだものの、一般参加との違いをあまり意識していなかった。


準備

  • 前もって会社からWi-Fiルーターを借りた。昨年は電波が干渉していたのか、Wi-Fi認識が悪かったので。
  • USBケーブルを持参した。行く途中でテストしてみたが、そもそもUSB 2.0でないと認識しないし、それもできるときとできないときがあった。スピードもイマイチだったが、ないよりはマシだった。
  • 今年からは専用アプリでチェックインするようになっていた。直前に慌ててログインする手間がなくなったのは良かったものの、AIに聞いても答えられないことが何回かあったり、キーノートしかライブ配信に対応していないなど、イマイチな点もあった。

当日

昨年も雨だったので、「いつもなぜこの時期にやっているのか」「そもそもなぜこんなに遠い幕張でやるのか」と考えながら移動した。幸い、思ったより雨は降っていなかった。

最近は寝不足気味でよく眠れず、移動しながらリリース作業をしていた。

開会まで15分ほどあり、歩いていけば十分間に合う想定だったが、しばらく歩いていたらすごい行列ができていた。結局、会場に入るまでちょうど1時間かかった。

やることもなかったので、無料漫画でお気に入りに入れていた「龍と苺」を読んでいたら面白くて、待ちながらずっと読んでいた。

その際、入口近くでスタッフが「Executive Forum参加の方はこちらへ」と呼びかける声が聞こえていたが、自分には関係ないと思い、一般の列に並んで入場した。


受付

受付では事前にインストールしたアプリからチェックインしようとしたが、なぜか「チェックインできない」と表示された。スタッフも最初につけていたストラップを外して違う色に変えたりと、慌ただしい様子だった。当時はなぜそうなっているのかわからなかったが、後から何となく理由がわかった気がした。


もらったもの

ストラップとイヤフォン、ギフト券をもらった。ギフト券には「帰る際にお土産を配布する」と書かれていた。ストラップはプラスチック製のICカード型に変わっており、出入りやブースでの認証が少し楽になった感じだった。


今回の目的のひとつであるクッションとシールをもらいに行ったが、クッションはすでに終わっている様子だった。前回もらったものがあるし、今回は諦めることにした。シールは昨年途中で品切れになったものもあったので長蛇の列ができていたが、とりあえず並んでゲットした。


この時点ですでに12時を過ぎていた。

お弁当をもらいに行こうとしたが、よく見るとお弁当のチケットをもらっていなかった。諦めて外で食べようと出たが、せっかくなのでお土産のことが気になり、案内された場所へ行ってみた。

行ってみると、空港のラウンジのような場所で、黒いスーツの人が警備をしており、誰も入れない雰囲気だった。しかし、なぜか私は入場OKだった。

中にお土産を配る係がいたので事情を聞いてみると、私がつけている灰色のストラップがExecutive Forum参加者の証明となっており、入れるエリアだったらしい。つまり、入口でスタッフに呼びかけられていたのは、まさに自分のことだったのだ。

ちょうど近くでお弁当も配っており、一般の方が食べているものとは段違いのお弁当が提供されていた。何より良かったのは、電源とWi-Fiが整った広々とした空間で仕事もできることだった。


 


 


参加したセッション

実践!Amazon RDS と Amazon Aurora のコスト最適化とパフォーマンス向上 [DAT318]

ラウンジが閉まるタイミングと重なり、慌ただしく移動したが、すでに満席で間に合わなかった。仕方なく、周辺にいたAWS担当者と色々と話をしていた。会社ではあまり話せる人が少ないこともあり、こうして話すのも久しぶりで楽しかった。

AWS DevOps Agent による自律的インシデント対応 ―その能力を引き出す設計のベストプラクティス― [CNS319]

こちらはしっかり時間を確認して座って視聴した。

障害対応を楽にできないか、という観点から「調査はAI、判断は人が行う」という発想が印象的だった。GitHubのコードも参照できるらしく、Kiro用の仕様書も作成してくれるとのこと。ぜひ試してみたいと思った。

  • Agent Spaceという単位で調査が可能
  • 複数のAWSアカウントを含めることができる

後半

その後はラウンジに戻り、MTGや仕事をこなしていた。おそらく半分以上は仕事をしていた。

時間になったので、最後の懇親会の雰囲気だけ見ようと思って入ってみた。みんなが話に盛り上がっているなか、お酒と少し高級な軽食もあったのでつまんでいると、前の職場の知り合いに会った。想定外の再会で話が盛り上がり、そのまま帰ることにした。

企業ブースはほとんど見ていなかったが、前から気になっていたので、ついでにStripeのブースだけ寄ってから帰った。もらったお土産は高級そうなお菓子だった。


感想

  • とにかくExecutive Forumのラウンジが良かった。来年もぜひ参加したい。
  • クッションはもらえなかったし、セッションもほとんど見られなかった。できれば2日目も参加したいが、仕事と体力がついていけない。


2026年5月8日金曜日

AWS Certified AI Practitioner合格

## 背景
会社の福利厚生で年2万円分、書籍または資格費用を請求できるが、
最近は資格費用を部署でも請求できるようになったため、微妙な金額が余ってしまった。

すでに前回SAPに合格していたので、AWSの試験はしばらく休もうかとも思ったが、
安めのAWS受験費とCloud Licenseの課金でちょうど使い切れそう。
しかも有休も余っていたので、受験に行くのに何も問題はなかった。

問題は勉強する時間があまりないことだったが、自分のお金でもないし、
ちょうどAI試験も気になっていたので受験してみることにした。
Practitionerだし、運が良ければなんとかなるのではないか、というノリ。

## 勉強した書籍・サービス
上記の通り請求できる範囲も決まっているし、時間もなかったので、Cloud Licenseのみで勉強した。
時間がなかったため、掲載されていた問題のうち2/3ぐらいしか見られなかった。もちろん、いつもやっている見直しもなし。

一応、試験に落ちた場合に勉強をし直すため、Amazonの欲しいものリストに関連書籍を入れていたが、今は削除済み。

## 受験日
前回のSAPとは異なり試験時間も短めだったので、特にトイレ対策はしていなかった。
むしろ、途中で我慢できなくなったら棄権することも考慮していた。

問題はCloud Licenseのものも出ていた気がするが、それよりも問題を解いて仕組みを理解したことが大きかった気もする。

## 結果
21:44にバッジの連絡が来たが、20分ぐらい前にAWSに反映されていた。ギリギリな感じではあったが、合格。


 

## 次はどうするか
さすがにAWS認定はしばらく休みたいが、Cloud Licenseの有効期限が7月中旬になっている。
このまま放置するのももったいないし、今度こそ気軽に勉強したい。Associateレベルで良いかも。
残りはDEAになるのかな。



2025年10月31日金曜日

AWS Certified Solutions Architect – Professional合格

前回sysopsに合格後、早速、受験準備をしていたが

勉強してみたところ、自分の知識があまりにも試験内容に追いついてないことが分かった。


前の受験時にもらったVoucherが使えて半額で受験ができた。次のは2027-10-31まで


最初は遅くても2025年の夏頃に予定を立てていたが、次から次へと延期して、最後は前回受験日の丁度1年経っていた。流石に1年以上延期するのはやりすぎな気もしたので、背水の陣として10/31に決めた。


勉強した書籍・サービス

 

・AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版

    2024/4に購。主に子供が習い事している間、図書館で読んでいた。問題がそのままでる訳ではないが、一通り読むと取り敢えず試験範囲が分かるので安心はする。1回読んで問題も全部見た

 

・Cloud License

今回も3ヶ月課金して集中的に確認。どちらかというと、こっちの方がメイン。一回全問解いて、間違った問題を確認していた。問題数が百以上もあったので課金の期間がキレるまで半分ぐらいしか見直せなかった。

後半で気づいたことだけど、問題によってはyoutubeで解説もしてくれるようになっていた。

 

・Udemy

Cloud Licenseの課金が切れたので、再度課金するのも可能だったが、丁度Udemyでセールしていたので、違う目線の問題を解いてみることにした。

5セットの試験を取り敢えず1回はこなせた。平均は66点程度

見直しは3セット目までやって、受験することに

Cloud Licenseよりも作成者の主観が入っているのが多く、間違った問題の解説が納得いかない、のもたまにあった。そもそもAIに聞いてみると自分の答えが合ってたりしていた



受験日

 

問題数をこなしても合格点ギリギリだったので、あまり自信がないまま迎えることになった

家族には何も言わず、いつもと同じ時間に家を出て、駅近くのカフェで問題の見直しをした。

トイレが心配でもあるけど、覚醒効果も欲しかったのでコーヒーを頼んだ。

試験場には珍しく既に何人か先客がいて、おそらくMicrosoftのAI関連資格を受験している人ぽかった。

受験の序盤、隣の席に受験者が入ってきたが、常に咳をしていて酷い時は繋がっているこっちの机も揺れるほどだった。

生理現象なこともあるので、どうしようもできないかも知れないが、こっちは大迷惑だった。


最後の10分ぐらい見直す時間はあったものの、チェックした問題を全部見返すことはできなかった。

肌感として7〜8割、勉強していた内容から出ていた感じで、他は知識と経験、または当てずっぽでチェックしていた。

cloudformationとはシェルコマンドでの対応がなかったのが幸いだった。

今でも覚えているのはAmazon connect関連で1問出ていたけど、全然分からなかった。そもそも、これって録音もできたのか?


時間ギリギリまで粘って、受験終了。図書館で予約した本を受け取って、近くのwendy'sで昼食。ここら辺で長いつもりだが、初めて入ったかも。今までだとラーメンとか食べたかも知れないが、歳だからか、消化できなそうな気がした


結果

 

20:16にいつものバッジ取得の連絡がきた。自信がなかったので、落ちたら次の受験日をいつにするか考えていたところだった。

自信ないわりには800以上得点していた。訳が分からなくなっている。


次はどうするか


念願のProfessional資格を取ったので、AWSはここで止めても良いかも知れないが

AWS Certified Developer - Associateが2026-04-15に期限切れ。

間に合うか分からないがAWS Certified DevOps Engineer - Professional(DOP-C02)を取れば維持はできるので、簡単そうであればやってみるのも良いかも


2024年10月31日木曜日

AWS sysops SOA-C02合格

年明け、Solutions Architect Associateがそろそろ来年期限切れなこともあったので

Solutions Architect Professionalにアプグレードしようかと考えて調べたところ

「SAProを取得する前にSysOpsの方を先に勉強しなさい。」的な書き込みをみて

急遽SysOpsの勉強を始めた。

 

勉強した書籍・サービス


・udemy(2024/1/1):【SOA-C02】AWS Certified SysOps Administrator - Associate 模擬試験

・kindle(2024/4):徹底攻略AWS認定SysOpsアドミニストレーター - アソシエイト教科書&問題集[SOA-C02]対応 徹底攻略シリーズ

・Cloud License(2024/10):プロフェショナル


最初はいつもどおり、udemyセールのタイミングで模擬試験を購入。2週目でやっと7割正解した感じ。悪くはないが、普段使用してないサービスが多かった為、一通り勉強ができるテキストが欲しいところ。それでkindleの本を買った。出先とか少し手が空いた時に読むぐらいで丁度よかった。

でも、この本の模擬試験を解いてみると雰囲気がだいぶ違うことに戸惑った。

相変わらず問題を解いてみると分からないことばかり。

それで、皆がどのように勉強しているかを調べたところ、ある記事でCloud Licenseというサービスを知ることができた。

無料で公開されている問題もあるが、それだけだと少なすぎ。何とか会社に請求できそうだったのでプロフェショナルにアップグレードしてひたづら問題を解いた。

確か問題数は多かったが、たまに被っているのもあったりする


もっと先に徹底的に準備をしてから受験に挑む、ことも可能だったが

10月中旬になってからこの勉強をするのも疲れてきた。

正解率はそんなに高くはなかったが、自分も分からない自信感もあったので

今期最終日を受験日とした。

この前の受験時にもらったVoucherが使えて半額で受験ができた。次のは2026/4/15まで

 

受験日


平日ではあったが、仕事もそんなに忙しくなかったし、午前中休みを取って受験しにいった。

朝は少し早かったので駅前の喫茶店で勉強のメモを見直した。

問題は3割程度難しい問題が出ていて、時間はギリギリな感じだった。見直しチェックしたものは半分しか見てなかったかと。

一応、試験前にトイレは行ったが終わる10分前ぐらいからトイレを我慢しなから頑張ってた。やっぱり年だし、これからこのような試験はトイレとの戦いになりそう。

 

結果


前の試験では18:30ぐらいに結果の連絡が来ていたけど、待てても連絡が来ない

試験が終わった後、何となく自信があったけど、どんどん落ちているのではないか?そんな気がしてきた。

丁度、会社でご飯を食べていたが、19:14にいつものバッジ取得のメールが来て、

19:17に合格の連絡がきた。

スコアは720点合格で753点。今回もまあまあギリギリ

 


 

今回は2027/10/31までの「50% Discount on your next Exam」を二つもらった。

できれば来年中にSolutions Architect Professionalを受けたい。Cloud Licenseも来年1月までなので早めに見ないと

2023年6月23日金曜日

AWS DEV DAYS 2023

どちらにせよ、普段有休は余ってあまり使う機会もないし

会社は有休にして、家では研修に行くと言って言ってきた


午前中は千円カットで散髪。

元々は秦野駅前の床屋に行ってみようと思ったが、入ったところお年寄りの人が10人ぐらい座っていて、最低40分かかるという話だった。

仕方なく、渋谷まで行って床屋を探した。

前髪切ったのが3月末だったのでちょうどいいタイミングだったかも


行く途中は先日slackでやり取りした案件が未解決で、先方とやり取りしながら電車内で仕事していた。



昼飯は初めはせっかくの東京なのでラーメンでも食べようとしたが、行列ができていて

行く途中のすき家で食べた。ここも出るときは人で混んでた。


事前に申請したのはこのような感じ


12:45 - 14:35 [H-1] Amazon CodeCatalyst ワークショップ:最新の DevOps サービスを使った開発を体験してみよう!

15:05 - 15:25   F-3-1: 英語で読もう!AWSドキュメント頻出英単語集1900!と、その作り方

15:30 - 15:50   F-3-2: ChatGPTとCIパイプラインを利用してドキュメント作成作業を自動化した話

16:10 - 16:55 [H-4] 開発系トレーニングでAWSクラウドのアプリケーション開発スキルを効率的に学ぶ方法

17:15 - 18:00 [H-5] セキュリティ/ガバナンス系サービスを使った安全なSandbox環境の作り方


最初のセッションはハンズオン。ゆっくり進行しているかと思いきや、どんどんグダグダになっていた。特にIAM設定を間違えてビルド失敗。原因がわからず講師が成功した受講者から確認することに。

開発系トレーニング〜は結局AWSのトレーニング宣伝だった。


帰ったらご飯があったけど、どうやら妻のだったらしい

子供を寝かし終えて降りてきた妻に怒られた。

夕御飯食べてくるとは一言も言ってなかったのに・・


数年前と比べてAWSのサービスが安定してきたこともあろうかと思うが

進化することでワクワクしてきた感じがなくなってきた気がする。

今回は時間と体力の無駄使いだった気がした。

これだったら昔と同じくリモート可にしてほしい。

2023年4月15日土曜日

AWS Certified Developer合格

 本来はrubyの資格でも勉強しようと思っていたが、ちょうど試験に落っても再度チャレンジできるキャンペーンをやっていたので「流石に2回受験すれば受かるだろう」な気持ちで

AWS Certified Developerの勉強をし始めた。

まずは昨年、電子版で購入して放置していた


ポケットスタディ AWS認定デベロッパーアソシエイト

を読み始めた。

仕事と子育てが忙しいことで、普段はあまり読めなかったけど3月帰省する際fireタブレットに入れて読んでいた。

あまり問題は解けなかったが、何とか文面だけでも一通り読めた。


あと、udemyから


AWS 認定デベロッパー アソシエイト模擬試験問題集(5回分325問)


も購入したが、一文も説いてない。もったいない。


受験はいつもの平塚の試験場。ここもだいぶ慣れてきた。

でも、机は小さいし、2時間も座って集中するにはあまり微妙な感じでもある。

今度受験するときは自宅でのリモート受験をしてみるのも良いかも知れない。


そもそも勉強量が少ないことで、難しい問題が多かったが、

前受験したSolutions Architect Associateで勉強した内容と被りそうなものもあったし

最近仕事でよく使っている機能についての問題が多かったので何とかできた感じ。


試験は午前中に終わったが、メールで連絡が来たのは18:25だった。

今回もバッジ取得のメールが先だった。


スコアは720点合格で730点だった。今回もギリギリな感じ。

再試験を受ける気満々だったけど、合格できて嬉しかった。

昨年の弓道三段と似たようなシチュエーションだな。


ちなみに今回は「50% Discount on your next Exam」というのを3つももらっている。

次はSolutions Architect Professionalかなーと思いづつ、3万超えなので迷っていたが

これなら来年に向けて勉強しても良いかも知れない。

そもそも時間が取れるか怪しいが・・


最近、部内でインフラを見ていた人が辞めたこともあり

私にその仕事が来ているけど、これで少しは自信持って出来そうな気がする。

2022年4月23日土曜日

AWSソリューションアーキテクトアソシエイト合格

概要

  • 合格はしたが、かなりギリギリな点数だったことで、他の人はそのようなことがなように勉強方法についてまとめる

AWS Certified Solutions Architect – Associateについて

  • 詳細はAWS公式などネットで情報が拾えるので、ここでは私が考えていることだけ述べる。以下SAAと記入します。
  • AWS認定中では一番定番な資格。書籍とか情報も多いので勉強しやすい。
  • クラウドプラクティショナーに比べると難しい。
  • Cloud Practitionerは幅広く知っておけば合格できる感じだが、SAAは各機能の詳細な仕様把握が必要
  • どっちも最新の機能を知っておく必要がある
  • 2022 年 8 月 30 日より、問題が変わるらしい。
AWS Certified Solutions Architect - Associate 認定試験は、2022 年 8 月 30 日に変更となります。現行の試験の最終受験日は 2022 年 8 月 29 日です。詳細はこちら。  

https://aws.amazon.com/jp/certification/coming-soon/

勉強方法

勉強期間・時間など

  • 正確に覚えてないか約半年以上から開始
  • 子供の世話で休日もほとんど時間が取れないことで、寝る前に数分・子供の昼寝時間に集中・仕事の合間を使用して勉強

資料

AWS認定 ソリューションアーキテクト − アソシエイト教科書

  • 先ずは会社に置かれていた、この黒本を一回読んだ。
  • ある程度基礎知識ある認識だったが練習問題を解いてみると、だいぶ不正解が多かった。
  • 本来は2週ぐらいする予定であったが、時間がないことでやめた。
  • 2019/1版であって、多少情報が古い感じがあった。足りないのはネットで調べる感じ

youtube

  • 本を読むことが難しい時はラジオ感覚で試験問題の解説を聞いてた。
  • サーバーワークス チャンネルがオススメ

模擬試験

udemy

  • 2月から本見るのをやめて 【2022年版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問) を開始
  • クラウドプラクティショナーの時は公式の模擬試験(2000円?)をやっていたが、丁度セールで1840円で購入
  • 1回目はほぼ本番と同じ難易度だが60点帯で不合格
  • 2回目以降は40〜50点台
  • 試験をするよりは黒本で足りなかった勉強すべき対象を拾う感じで、試験してから間違いを見直すことに注力した。
  • スマポのudemyアプリで時間と場所に問わず勉強ができたのが良かった。
  • 見直しの際にスクロールが長くなるのがデメリット
  • これも2回は見直ししたかったが、時間がなくてできなかった。
  • 本でベース知識ができれば、後はudemyだけでも足りている気がする。

AWS Summit Online早期登録者特典の模擬試験

  • 2022年のAWS Summit Online早期登録者対象に模擬試験が無料で受けられるクーポンを配っていた。
  • 難易度はudemyの1回目試験ぐらい
  • 問題の解説はないが、結果は合格だった。この結果で試験を受けれる自信ができた。

試験申込み

  • リモートも考えたが、前回(横浜)とは異なって家近く(平塚)でも受けることができるようになったので、会場で受けることにした。理由としては
  • 試験の間、邪魔が入れない自信がなかった
  • 部屋に冷房がない
  • 部屋の片付けが大変
  • 実際会場は以下のデメリットもあった
  • モニターが小さい
  • 冷房が効きすぎ
  • 大部屋を使っていたため、試験中に他の受験者が出入りしている

試験

  • 結構時間がギリギリだった。140分だったが、終わった時は15分残していたので10分の間にチェックした問題を再度確認した。
  • 終わった後は相変わらず合格しました〜 な文言が表示され、ややこしい気分になる。
  • 11時半ぐらい試験が終わって、18時ぐらいに「バッジ発行のお知らせ」メールがきた。ちなみに合格の連絡は2日後に来てた。

記憶に残る問題

  • 試験中、悩んだ問題をまとめてみた。他も難しい問題はあったけど
    これらは結構時間を掛けて考えてもわからなかったので、記憶に残っていたかも。
    もし、この記事を見ている方で
    答えがわかるのであれば是非コメントして欲しいです。

確実にRDSへ書き込みできる早い手段は?

  • 質問はピーク時、アクセスが集中すぎてDBインスタンスのCPU負荷→データ書き込みロスが発生すること。
    例文ではデータをSQSへ送りRDS書き込むか、SNSへ送ってRDSに書き込む
    どちらか。
  • 確実に送るのであればSQS - RDSだが、SNSに比べると遅くなる認識。
    となるとSNS-RDSかな?と思ったけど、あまりそういた構成は聞いたことがない
  • 知っている限りではこれが一般的な構成だが、どうだろ・・
    SNSとSQSのファンアウトをやってみた

AWS datasync vs AWS database migration service、どっちを使うべきか?

  • 質問内容は思い出せないけど、AWS datasyncとAWS database migration service、どっちを使うべき? な問題があった。
  • 両方ともオンプレミスからAWSデータ移行ツールなのはわかっていたが、そもそも「何が違ったのか」までは抑えてなかった。
    これを見ておけば良かったかも
    オンプレミスからAWSへの移行で押さえておきたいツールまとめ
  • そういえばsnow ballでの移行も、問題が出てた。

EBSマルチアタッチとEFS、どっちを使うべきか?

  • EBSもプロビジョンド IOPSのSSDであれば複数のEC2にアタッチできるようになっているが、そもそもEFSとどちらを選ぶべきか?
    質問が複数でていた。
  • この記事には
I/Oフェンシングプロトコルに対応していないため、アプリケーション側で同時書き込みの排他制御を担保する必要がある  

と書かれていることもあるので
EFSを使用した方が無難かなーと思いづつ、よくわからない。

AWS Shield Standard と AWS Shield Advanced

  • どっちらを使うべきか?な質問も複数でていた。
  • この記事通り、AWS Shield Advancedは有料だし
    かなり特集なケースまで対応してくれることで、大抵はAWS Shield Standardで事足りる認識だが
    何か問題の中で見逃していたのがあったかもしれない。
    AWS Shield Standard と AWS Shield Advanced違いまとめ

RDSプロキシ

  • lambda + RDSプロキシ構成の際、RDSのアップデートが行われると、lambda処理は待ててくれるか?
    な例があった。
  • RDSが複数のAZにデプロイされているのであれば、なんとか振り分けてくれそうな気がするが
    1台構成だとダメそうなきがする。
    RDS Proxyとは?

その他

  • 同じことができる構成を幾つが並べて
    この中で一番実装が簡単なものは?, この中でコストが一番安いものは?
    な感じの問題がよく出ていた。

今後の予定

  • 今年度は部署も変わることで、試験はしばらく休みたい。
  • 次やるのであればSolutions Architect Professionalだが、こんなに頑張ったにも関わらず今回試験がかなりギリギリだったので、受かる気にならない。
  • Certified Developer Associateなら仕事にも関係あるだろうし、余裕がでたら調べてみたい