チーム開発でAWS Amplify環境を複数人で使うときの注意点

エンジニアの記録
技術メモ・実体験

amplify pushを1回実行しただけで、別の人がマージ済みだった「Lambdaの固定IP設定」を消しました。SalesforceのAPIが弾かれ、Slackにエラー通知が大量に流れ、復旧に数時間かかりました。

なぜ固定IPが必要だったのか、なぜ消えたのか、どう直したのか。事故の一部始終を正直に書きます。

対象読者

AWS Amplifyをチームで使っている人、Lambdaから外部API(Salesforceなど)を叩いていて出口IPを固定している人に向けて書きます。

PROFILE 20代ITエンジニア|チームでAWS Amplifyを使って開発中|Raw Ambition 運営
キラ
キラ
「自分のコードは正しい」と思っていた。問題は、自分が触っていないインフラ設定まで巻き込んで上書きしたこと。
Contents
  1. なぜLambdaに固定IPが必要だったか(Salesforce凍結問題)
  2. 事故発生:amplify pushで固定IPが消えた
  3. なぜ消えたのか ― amplify pushの本質
  4. 復旧手順と、数時間かかった理由
  5. 再発防止のために変えたこと
  6. まとめ

なぜLambdaに固定IPが必要だったか(Salesforce凍結問題)

そもそもなぜ固定IPが必要だったのか。ここを理解しないと、この事故の重さが伝わりません。

このアプリはモバイルからSalesforceにログインして連携する仕組みでした。ところがモバイルからアクセスするたびに送信元IPが変わる。Wi-Fi、モバイル回線、場所が変われば当然IPは変動します。

Salesforce側にはセキュリティ機能があり、見慣れないIPからのアクセスが続くと不正と判断してアカウントを凍結します。IPが毎回変わる=毎回「知らないIP」とみなされ、凍結されるという状態でした。

?️ 固定IP導入前の問題 モバイルアプリ(IPがバラバラ) ↓ 直接ログイン Salesforce ↓ 「知らないIPだ」 セキュリティが弾く → アカウント凍結

これを解決するため、Lambdaを経由させて出口IPを固定しました。モバイルからのアクセスを一度Lambdaで受け、そこからSalesforceへ。LambdaをVPCに配置しNAT Gateway経由で通信させることで、出口IPが常に同じになります。

✅ 固定IP導入後 モバイルアプリ(IPはバラバラのまま) ↓ Lambda(VPC + NAT Gateway) ↓ 出口IPは常に固定 Salesforce ↓ 「いつものIPだ」 アクセス許可 → 凍結されない

? POINT

外部サービスがIP制限(許可リスト)でアクセスを絞っている場合、クラウドからの通信は出口IPを固定する必要があります。Lambdaの場合はVPCに入れてNAT Gateway経由にするのが定番です。この固定IPをSalesforce側の許可リストに登録していました。
スカイ
スカイ
つまりこの固定IPは「アプリが動くための生命線」だったんだね。これが消えると連携が全部止まる。

事故発生:amplify pushで固定IPが消えた

事故は、別のPRのレビュー中に起きました。

TROUBLE

PRレビューでブランチを切り替えてamplify pushしたら、固定IP設定が消えた

あるPRの動作確認のため、そのブランチに切り替えてamplify pushを実行した。すると、別のPRですでにマージ済みだった「Lambda VPC + 固定IP設定」が上書きされて消えた。出口IPが変わり、Salesforceから見ると「知らないIP」になった。結果、API連携が弾かれ、Slackにエラー通知が大量に流れ始めた。

レビュー対象のブランチは、固定IP設定がマージされるに切られていた。つまりそのブランチのローカル設定には固定IPの定義が存在しなかった。amplify pushはローカルの設定でAWSを上書きするため、「固定IPがない状態」がそのままAWSに反映され、本番の固定IPが消えた。

⚠️ 一番怖いポイント

自分が編集したのは全く別のコードでした。固定IP設定には一切触れていない。それでも、ブランチが古いというだけで、触っていない設定まで巻き込んで消えました。amplify pushは「差分だけ」ではなく「ローカル全体の状態」をAWSに反映するためです。

なぜ消えたのか ― amplify pushの本質

この事故の根本原因は、amplify pushの挙動を正しく理解していなかったことです。

amplify pushは「自分が変更した差分だけを送る」ものだと思っていました。実際は違います。ローカルのamplify設定(backendの定義)全体を、現在の環境のAWSに反映するコマンドです。

⚙️ 誤解していたこと 【思っていた挙動】 自分が変えた差分だけAWSに反映される 【実際の挙動】 ローカルのbackend定義の「現在の状態」が そっくりそのままAWSに反映される (ローカルにない設定 = AWSから削除される)

だから「固定IP設定を含まない古いブランチ」でamplify pushすると、AWSは「固定IPは不要になったんだな」と解釈して削除します。悪意も操作ミスもなく、コマンドの仕様通りに動いた結果でした。

キラ
キラ
「差分を送る」じゃなくて「ローカルの状態でAWSを上書きする」。この違いを知らなかったのが全ての原因だった。

復旧手順と、数時間かかった理由

復旧自体の手順はシンプルでした。固定IP設定を含む最新ブランチに戻して、再度pushするだけです。

# 固定IP設定を含む最新ブランチに戻る git checkout main # 固定IP設定がマージ済みのブランチ amplify pull # AWSとローカルの状態を同期 amplify push # 正しい設定で再反映

ただ、原因の特定に数時間かかりました。理由はこうです。

1
Slackにエラー通知が大量発生
最初は「Salesforce側の障害か?」と疑った。自分のpushが原因だと最初は気づかなかった。
2
原因の切り分けに時間がかかった
「IPが弾かれている」とわかるまでに、ログを追い、Salesforce側の設定を確認し、AWS側の構成を確認した。インフラ・外部サービス・アプリのどこが原因か切り分けるのに時間を使った。
3
他の人を巻き込んだ
自分一人では原因が確定できず、インフラに詳しいメンバーに入ってもらった。「固定IPが消えている」と判明したのはそこから。1人で抱えず早く相談すべきだった。
4
復旧
固定IP設定を含むブランチで再push。出口IPが元に戻り、Salesforce連携が回復した。

? 教訓

手順自体は数分でも、「何が起きているか分からない時間」が一番長い。原因が自分のpushにあると早く疑えていれば、復旧はずっと早かったはずです。

再発防止のために変えたこと

① PRレビューの動作確認は個人環境でやる

チーム共有の環境でamplify pushしないのが大前提。動作確認は個人の検証環境に切り替えてから行うようにしました。

# 作業前に必ず現在の環境を確認 amplify env list # * がついているのが現在の環境 # レビューの動作確認は個人環境で amplify env checkout ローカル # 個人環境に切り替え amplify push # ここでpushしてもチームに影響しない # 終わったらチーム環境に戻す amplify env checkout dev

② pushする前にブランチの新しさを確認する

古いブランチでpushすると、その後マージされた設定が巻き戻る。レビュー対象ブランチがmainの最新を取り込んでいるか確認してからpushするようにしました。

# レビュー対象ブランチが最新を取り込んでいるか確認 git checkout feat/review-target git merge main # または rebase で最新を取り込む # これで「古い状態で上書きする」事故を防げる

③ 重要なインフラ設定は何が含まれているか共有する

固定IPのような「消えると全停止する設定」がどのブランチ・どの構成に含まれているかを、チームで把握しておく。今回は自分がそれを知らなかったことも原因の一つでした。

⚠️ amplify pushの鉄則

amplify pushは「ローカルの状態でAWSを上書きする」コマンド。実行前に必ず「今どの環境にいるか」「このブランチは最新か」の2つを確認する。この2つだけで、今回のような事故はほぼ防げます。

? この記事のまとめ
  • モバイルはアクセスのたびにIPが変わり、Salesforceに凍結される。だからLambda経由で出口IPを固定していた
  • 固定IP設定を含まない古いブランチでamplify pushしたら、本番の固定IPが消えた
  • amplify pushは差分ではなく「ローカルの状態全体」でAWSを上書きする
  • 復旧手順は数分。でも原因特定に数時間かかった。早く自分のpushを疑うべきだった
  • 再発防止:個人環境でpush・ブランチを最新化・重要インフラ設定をチームで共有

触ってもいない設定を消すことがある。それがamplify pushの怖さです。でも「どの環境か」「このブランチは最新か」の2つを確認するだけで、この事故は防げます。同じ思いをする人が減れば嬉しいです。

Recommended
ブログを始めるならConoHa WINGが最速
エンジニアの技術メモをブログで発信して収益化。月1,000円以下で始められます。
▶ ConoHa WINGを見てみる
※ アフィリエイトリンクです
Next
次回:「EAS BuildでiOSアプリをビルドするときに詰まったこと」
Raw Ambition 始動から14日目

コメント

タイトルとURLをコピーしました