閉域 VPC の AWS Deadline Cloud CMF Worker では STS の VPC エンドポイントが要る話
はじめに
AWS Deadline Cloud の CMF (Customer-Managed Fleet) Worker を、インターネットへの出口を持たない閉域 VPC で動かしたときに遭遇した問題について共有します。
Worker Agent サービスは Fleet に IDLE 状態で追加され、一見すると正常です。ところがいざジョブを流すと、入力ファイルの同期の段階で次のエラーが出てタスクが失敗しました。
Connect timeout on endpoint URL: "https://sts.ap-northeast-1.amazonaws.com/"
Deadline Cloud の Worker Agent は STS (AWS Security Token Service) を呼ばずに動く設計だと理解していたので、ジョブ実行の段階で急に STS への接続が現れるのは意外でした。
結論を先に書くと Worker Agent 本体は確かに STS を呼びません。ですが、入力ファイルの同期を担う job attachments の処理だけは内部で STS にフォールバックします。 そのため閉域 VPC では STS のインターフェイス VPC エンドポイントを足すと解決します。
AWS Deadline Cloud とは
AWS Deadline Cloud は、3DCG/VFX 制作向けのレンダーファームをクラウド上に構築できるマネージドサービスです。Worker のオートスケーリングやジョブ管理、ライセンス供給などレンダーファーム運用に必要な機能を備えています。
対象読者
- AWS Deadline Cloud の CMF を閉域 VPC で構築している、もしくは検討している方
- Worker は正常に見えるのにジョブだけ失敗する事象の切り分けに悩んでいる方
- Deadline Cloud の Worker が AWS のクレデンシャルをどう取得しているかを知りたい方
参考
- AWS Deadline Cloud Developer Guide: Customer-managed fleets
- AWS Deadline Cloud Developer Guide: Storage profiles と job attachments
- AWS PrivateLink: Interface VPC エンドポイントの作成
- aws-deadline/deadline-cloud-worker-agent
- aws-deadline/deadline-cloud (job attachments 実装)
前提となる構成
再現条件を把握できるよう、まずは 3 つの前提について説明します。
- CMF: AWS が Worker を起動する SMF (Service-Managed Fleet) と異なり、利用者が用意した EC2 を Worker として Fleet に登録する方式です。
- 閉域 VPC: 本記事では、インターネットゲートウェイも NAT も持たず、外向きのインターネット通信ができない VPC をこう呼びます。一般的なプライベートサブネットは NAT 経由で外向き通信ができますが、ここではそれも遮断し、必要な AWS API にはインターフェイス VPC エンドポイント (PrivateLink) 経由でのみ到達します。
- job attachments: シーンファイルなどの入力を S3 経由で Worker に同期する Deadline Cloud の仕組みです。入力同期は Worker 上で
syncInputJobAttachmentsというアクションとして走ります。
構成を図にすると次のようになります。Worker Agent 本体が deadline のエンドポイント経由でクレデンシャルを得る経路と、job attachments が S3 や STS を呼ぶ経路を分けて描いています。
症状
ジョブを投入すると READY から RUNNING までは進みます。ところが入力同期の段階でタスクが FAILED し、CloudWatch Logs の progressMessage に次のメッセージが出ます。
An issue occurred with AWS service request while downloading binary file:
Connect timeout on endpoint URL: "https://sts.ap-northeast-1.amazonaws.com/"
なぜ Worker Agent 本体は STS を呼ばないのか
Worker Agent が起動して Fleet に参加できている時点で、何らかの AWS クレデンシャルは取得できているはずです。ところがその経路は STS ではありません。Worker Agent は起動時に deadline の AssumeFleetRoleForWorker という API を呼び、fleet worker role の一時クレデンシャルを deadline のエンドポイント経由で受け取ります。クレデンシャルの払い出しを deadline サービス自身が肩代わりする仕組みで、sts:AssumeRole を直接は呼びません。
Worker Agent では次のようなログが出ます。
[AWSCreds.Query] Requesting AWS Credentials
[deadline:AssumeFleetRoleForWorker] (200) accessKeyId=ASIA... sessionToken=...
[AWSCreds.Query] Obtained temporary Worker AWS Credentials.
このため、STS のエンドポイントが無い閉域 VPC でも Worker Agent 本体は問題なく動き、Fleet に IDLE 状態で追加されます。ここが、Worker は正常に見えるのにジョブだけ落ちる、という分かりにくさの正体です。
なぜ job attachments だけ STS を呼ぶのか
入力同期で STS が登場するのは、S3 の GetObject 時に付与する ExpectedBucketOwner ヘッダのために AWS アカウント ID が必要になるからです。このアカウント ID の解決の連鎖が、閉域 VPC で初めて表面化します。
job attachments の処理は、まずセッションからアカウント ID を取り出そうとします。ところが Worker Agent が払い出すクレデンシャルのファイルは、Version と AccessKeyId と SecretAccessKey と SessionToken と Expiration の 5 つしか持たず、AccountId のフィールドを含みません。さらにクレデンシャル取得用に書かれるプロファイルの設定にも aws_account_id がありません。その結果、botocore はアカウント ID を None と判定し、最終手段として sts.get_caller_identity() を呼びます。
ここまでの連鎖をまとめると次のようになります。
- job attachments が S3 GetObject の
ExpectedBucketOwner用にアカウント ID を要求する。 - クレデンシャルのファイルに
AccountIdが無く、プロファイルの設定にもaws_account_idが無い。 - botocore がアカウント ID を None と判定し、フォールバックで
sts.get_caller_identity()を呼ぶ。 - 閉域 VPC に STS のエンドポイントが無いため、STS への TCP 接続がタイムアウトする。
- job attachments がこの例外を捕捉し、入力ファイルのダウンロード失敗としてタスクを
FAILEDにする。
対処
対処方法は、STS のインターフェイス VPC エンドポイント (com.amazonaws.<region>.sts) を VPC に追加することです。これによりフォールバックの get_caller_identity() が VPC 内で解決でき、入力同期が完走します。エンドポイント 1 つあたり月額数ドル程度で、最も素直な解決策です。
代替案として以下のようなものも考えられます。
- シーンファイルの配信を job attachments 経由ではなく AMI への焼き込みや S3 からの直接ダウンロードに変え、
syncInputJobAttachments自体を走らせない方法 - プロファイルの設定に
aws_account_idを書き込んで STS へのフォールバックをスキップさせる方法 (ただし、これはライブラリ側の挙動に踏み込むため工数が大きく、おすすめしません。)
まとめ
閉域 VPC で CMF Worker を組むとき、Worker Agent 本体が IDLE で追加されることとジョブが完走することは別問題です。Worker Agent 本体はクレデンシャルの払い出しで STS を回避しますが、job attachments の入力同期は別経路で STS にフォールバックします。閉域 VPC では STS のインターフェイス VPC エンドポイントを忘れずに用意してください。
閉域 VPC で Deadline Cloud の CMF Worker を構築する方の参考になれば幸いです。





