Slide 1

Slide 1 text

軽いノリで “自動化” に取り組んではいけないという話 O c t o b e r 5 , 2 0 2 4 J a p a n A z u r e U s e r G r o u p 1 4 周 年 イ ベ ン ト Tetsuya Odashima   @TetsuyaOoooo

Slide 2

Slide 2 text

自 己 紹 介 小田島 哲也 (おだしま てつや) パーソルクロステクノロジー株式会社 Azure 技術サポート/導入コンサル/人財育成 Microsoft MVP for Microsoft Azure (2018~) X @TetsuyaOoooo Qiita https://qiita.com/tetsuya-ooooo ET ソフトウェアデザインロボットコンテスト (ET ロボコン) 実行委員会 https://www.etrobo.jp/ 好きなこと ラジオを聴く、バイク、積みプラ

Slide 3

Slide 3 text

みんな、PowerShell スキ? AzCopy スキ? 遭遇した現象について、その原因と対処したこと × 3 本立て 最終的にこのように対処しました (まとめ) さいごに 【注意】 一部には、個人的に検証した結果、個人的な考察が含まれています、ご了承ください ア ジ ェ ン ダ

Slide 4

Slide 4 text

ジョブ管理 システム ・ ・ ・ 一斉に PS スクリプト (コマンド) を実行 ※並列実行 リソースに 大量のリクエスト Azコマンドレット AzCopy JapanWest JapanEast ・・・ 😱何 や ら か し た ? ( 全 体 的 な 現 象 ) PS スクリプト単体で実行すると正常に動作するが、同時に複数実行すると一部の PS セッションが 異常終了する、長時間実行中となる ※すべて同じマネージド ID を使用 ストレージ間で Blob をコピー &世代管理

Slide 5

Slide 5 text

😱何 や ら か し た ? ( 具 体 的 に ) マネージド ID を用いて Azure リソースを操作するコマンドレットを実行したら、 Your Azure credentials have not been set up or have expired, please run Connect-AzAccount to set up your Azure credentials. ManagedIdentityCredential authentication failed: Service request failed. というメッセージが出力され、後続処理が失敗する Azure リソースに対して短期間に大量のリクエストを行ったら、一部のリクエストが拒否される ひとつの VM 内で AzCopy を同時に複数実行したら、 処理に多くの時間を要する メモリが枯渇してしまう

Slide 6

Slide 6 text

マネージド ID を用いて Azure リソースを操作 するコマンドレットを実行したら... 😱

Slide 7

Slide 7 text

IMDS RBAC # 認証キャッシュをクリア Clear-AzContext -Scope Process -Force # Azure へ接続 Connect-AzAccount -Scope Process ` -Subscription $subscriptionId ` -Identity -AccountId $clientId # 自動化したい処理を実行 $resources = Get-AzResource ア ク セ ス ト ー ク ン を 要 求 Connect-AzAccount 実行後 も、IMDS に対して暗黙的な やり取りが行われる ↓ 制限を超過するリクエスト ↓ 404, 429, 5xx を返却 アクセストークンを提示 & 操作を要求 アプリ (.ps1) 🤔マ ネ ー ジ ド I D を 用 い て A z u r e リ ソ ー ス へ の ア ク セ ス 割り当て アクセス権限 を付与 応 答 マネージド ID Entra ID Azure リソース

Slide 8

Slide 8 text

VM でのマネージド ID に適用されるレート制限 ※IMDS の制限に依存する マネージド ID (システム割り当て/ユーザー割り当て) へのリクエストは、 1 秒間に 20 個まで 同時に処理できるリクエストは 5 個まで と制限されている これらの制限を超過すると、HTTP Status 404, 429, 5xx のレスポンスで リクエストが拒否される  → Azure 認証情報を失う   → 後続処理が失敗する 😢マ ネ ー ジ ド I D に 適 用 さ れ る 制 限 マネージド ID に適用される レート制限はありますか?

Slide 9

Slide 9 text

👍こ の よ う に 対 処 し ま し た ( 1 ) 🧙‍♂️Connect-AzAccount を含めてリトライを実施する 参考:再試行のガイダンス (注意) Az コマンドレットでは、ARM REST API のレスポンスは取得 できず...→リトライのトリガーは、「例外が発生したら」とする 🧙‍♂️Connect-AzAccount -Scope パラメーターで Azure コンテキストの有効 範囲を指定する Process 現在のセッション (プロセス) のみ CurrentUser ユーザーが開始した全セッション で共有 for ($i = 0; $i -le $retryCount; $i++) { try { # 認証キャッシュをクリア Clear-AzContext -Scope Process -Force # Azure へ接続 Connect-AzAccount -Scope Process ` -Subscription $subscriptionId ` -Identity -AccountId $clientId # 自動化したい処理を実行 $resources = Get-AzResource } catch { # リトライに必要な処理 } } 再試行のガイダンス 自動化で、マネージド ID と Connect-AzAccount を使用 する際に気をつけること - Qiita

Slide 10

Slide 10 text

Azure リソースに対して 短期間に大量のリクエストを行ったら... 😱

Slide 11

Slide 11 text

Azure Portal Azure PowerShell Azure CLI REST Client SDKs Authentication Get-AzResource Microsoft .Web Microsoft .Sql Microsoft .Compute Microsoft .Storage Azure リソースの操作は、 ARM REST API を使用している (HTTP 要求) 🤔ク ラ イ ア ン ト か ら A z u r e リ ソ ー ス へ の リ ク エ ス ト Azure Resource Manager (management.azure.com) ・・・ Azure Resource Manager とは

Slide 12

Slide 12 text

Get-AzResource WestUS 1 N ... WestUS2 1 N ... EastUS 1 N ... EastAsia 1 N ... WestIndia 1 N ... ・・・ ・・・ プリンシパル × サブスクリプションの制限 (現) 要求の調整 プリンシパル (ユーザー/アプリ) × サブスクリプション ※1 時間ごと (新) 要求の調整 プリンシパル (ユーザー/アプリ) × サブスクリプション × 操作の種類 1 N リソースプロバイダーの制限 要求の調整 リソースプロバイダーごとに独自の制限 サブスクリプション内の対象リソースの リージョンごとに調整 超過すると 429 (Too many requests) でリクエストを拒否 😢A z u r e リ ソ ー ス へ の リ ク エ ス ト に 適 用 さ れ る 制 限 Azure Resource Manager が要求を調整する方法の概要 Azure Resource Manager (management.azure.com) (例) ユーザー:シアトル Azure リソース:東日本 ユーザーの物理リージョン (WestUS) によって、 Azure Resource Manager にルーティングされる ... Azure Resource Provider Azure リソースのリージョン (JapanEast) によって、 Azure Resource Provider にルーティングされる

Slide 13

Slide 13 text

全般 📉Azure リソースへのリクエスト (同時発生) を極力減らす、分散させる 同時に実行する PS セッション数を減らす ジョブ管理システム側で、自動化ジョブの構成を見直す 東西のストレージ構成を変更する コピー元 (東日本):コピー先 (西日本) = (前) N : 1 → (後) 1 : 1 AzCopy 🍚大量のファイル向けに最適化する ファイル (Blob) の Length チェックを無効 コンカレンシー (同時リクエスト数) を最適化 azcopy copy ジョブのサイズをより小さく 🔄️azcopy copy ジョブが失敗した場合は、その失敗したジョブを調査し、 必要に応じてリトライ (ジョブ再開) を実施する 失敗した Blob (コピー元) が存在しなくなるまで、その失敗したジョブを 再開 (azcopy resume) 👍こ の よ う に 対 処 し ま し た ( 2 ) AzCopy でログとプラン ファイルを使用してエラーの 検出とジョブの再開を行う Azure Storage で AzCopy のパフォーマンスを 最適化する

Slide 14

Slide 14 text

ひとつの VM 内で AzCopy を同時に複数実行したら... 😱

Slide 15

Slide 15 text

👍こ の よ う に 対 処 し ま し た ( 3 ) Azure Storage で AzCopy のパフォーマンスを 最適化する AzCopy のパフォーマンスを最適化 ⏲️処理時間、メモリ使用量を最適化 🧹Blob の削除方法を変更 (前) azcopy remove → (後) Get-AzStorageBlob | Remove-AzStorageBlob (前) 削除対象のすべての Blob の削除をいっぺんにリクエスト → (後) N 件ごとに削除をリクエスト 🏃‍♂️‍➡️実行環境を最適化 💪最高のパフォーマンス→実行される AzCopy (プロセス) はひとつだけ ひとつの VM インスタンス内で実行される PS セッションは、必ずひとつだけとする 全体として並列実行を行うために、複数の VM インスタンスを用意する

Slide 16

Slide 16 text

ジョブ管理 システム JapanEast ・・・ JapanWest ・・・ PS スクリプトを実行 ひとつの VM インスタンス に対して、ひとつずつ コマンドを実行 ※並列実行 リソースにリクエスト Az コマンド AzCopy リソースにリクエスト Az コマンド AzCopy リソースにリクエスト Az コマンド AzCopy リソースにリクエスト Az コマンド AzCopy リソースにリクエスト Az コマンド AzCopy 📉リクエストを分散させるために、 対象リソースの構成を見直す 🙆最 終 的 に こ の よ う に 対 処 し ま し た ( ま と め ) ストレージ間で Blob をコピー & 世代管理 🧙‍♂️🔄️アプリのリトライ戦略を施す 🍚⏲️🏃‍♂️‍➡️AzCopy パフォーマンス チューニング 💪アプリの実行環境を複数用意する 📉リクエストを分散させるために、 自動化のジョブの構成を見直す ※VM インスタンス内で実行する  PS セッションはひとつだけ ※すべて同じマネージド ID を使用

Slide 17

Slide 17 text

🍵さ い ご に Azure リソースに対して短期間に大量のリクエストを行うとその一部が拒否されるのは、 レート制限やスロットリングと呼ばれる仕組みが働いているため リソースの保護 : リソースが過負荷になるのを防ぎ、安定したパフォーマンスを維持するため a. 公平性の確保  : 他のユーザーやアプリケーションがリソースを公平に利用できるようにするため b. セキュリティ  : 不正なアクセスや DDoS 攻撃からリソースを守るため c. 自動化でエラーに遭遇した際は、無闇にリトライを実施しない→リトライ戦略をちゃんと考える リトライ条件  : 発生し得るエラー (例外) で必要/不要を判断 a. リトライ間隔  : リソースに余計な負荷をかけないために、無駄なリクエストを発生させない b. リトライ回数  : 諦めることも必要、運用でカバー! c. 自動化で AzCopy を使う際は、パフォーマンスチューニングは必須 AzCopy ジョブを並列で実行したい場合は、複数クライアント (実行環境) を用意する 求められる自動化を実現する方法だけに囚われず、このような事柄を踏まえて取り組みましょう 「機能要件定義」 & 「機能設計」も大事! 「非機能要件定義」 & 「非機能設計」も大事!

Slide 18

Slide 18 text

Tetsuya Odashima   @TetsuyaOoooo Thank you! ご清聴ありがとうございました O c t o b e r 5 , 2 0 2 4 J a p a n A z u r e U s e r G r o u p 1 4 周 年 イ ベ ン ト