W&BプラットフォームをAWSにデプロイするには、W&B Server AWS Terraform Module の使用を推奨します。
開始する前に、State File を保存するために Terraform で利用可能な リモートバックエンド のいずれかを選択することをお勧めします。
State File は、すべてのコンポーネントを再作成することなく、デプロイメントのアップグレードや変更を行うために必要なリソースです。
Terraform モジュールは、以下の 必須 コンポーネントをデプロイします。
- Load Balancer
- AWS Identity & Access Management (IAM)
- AWS Key Management System (KMS)
- Amazon Aurora MySQL
- Amazon VPC
- Amazon S3
- Amazon Route53
- Amazon Certificate Manager (ACM)
- Amazon Elastic Load Balancing (ALB)
- Amazon Secrets Manager
その他のデプロイメントオプションには、以下のオプションコンポーネントが含まれる場合があります。
- Elastic Cache for Redis
- SQS
必要な権限
Terraform を実行するアカウントは、イントロダクションで説明したすべてのコンポーネントを作成できる必要があり、さらに IAM ポリシー と IAM ロール を作成し、リソースにロールを割り当てる権限が必要です。
一般的な手順
このセクションの手順は、このドキュメントで扱うすべてのデプロイメントオプションに共通です。
-
開発環境を準備します。
- Terraform をインストールします。
- バージョン管理のために Git リポジトリを作成することをお勧めします。
-
terraform.tfvars ファイルを作成します。
tvfars ファイルの内容はインストールタイプに応じてカスタマイズ可能ですが、最小限の推奨構成は以下の例のようになります。
namespace = "wandb"
license = "xxxxxxxxxxyyyyyyyyyyyzzzzzzz"
subdomain = "wandb-aws"
domain_name = "wandb.ml"
zone_id = "xxxxxxxxxxxxxxxx"
allowed_inbound_cidr = ["0.0.0.0/0"]
allowed_inbound_ipv6_cidr = ["::/0"]
eks_cluster_version = "1.29"
namespace 変数は Terraform によって作成されるすべてのリソースのプレフィックスとなる文字列であるため、デプロイ前に tvfars ファイルで変数を定義していることを確認してください。
subdomain と domain の組み合わせによって、W&B が設定される FQDN(完全修飾ドメイン名)が形成されます。上記の例では、W&B の FQDN は wandb-aws.wandb.ml となり、DNS の zone_id はその FQDN レコードが作成される場所になります。
allowed_inbound_cidr と allowed_inbound_ipv6_cidr も設定が必要です。このモジュールではこれらは必須の入力項目です。上記の例では、あらゆるソースから W&B インストール環境へのアクセスを許可しています。
-
versions.tf ファイルを作成します。
このファイルには、AWS に W&B をデプロイするために必要な Terraform および Terraform プロバイダーのバージョンが含まれます。
provider "aws" {
region = "eu-central-1"
default_tags {
tags = {
GithubRepo = "terraform-aws-wandb"
GithubOrg = "wandb"
Enviroment = "Example"
Example = "PublicDnsExternal"
}
}
}
AWS プロバイダーの設定については、Terraform 公式ドキュメント を参照してください。
オプションですが、このドキュメントの冒頭で言及した リモートバックエンド設定 を追加することを強くお勧めします。
-
variables.tf ファイルを作成します。
terraform.tfvars で設定した各オプションに対して、Terraform は対応する変数宣言を必要とします。
variable "namespace" {
type = string
description = "Name prefix used for resources"
}
variable "domain_name" {
type = string
description = "Domain name used to access instance."
}
variable "subdomain" {
type = string
default = null
description = "Subdomain for accessing the Weights & Biases UI."
}
variable "license" {
type = string
}
variable "zone_id" {
type = string
description = "Domain for creating the Weights & Biases subdomain on."
}
variable "allowed_inbound_cidr" {
description = "CIDRs allowed to access wandb-server."
nullable = false
type = list(string)
}
variable "allowed_inbound_ipv6_cidr" {
description = "CIDRs allowed to access wandb-server."
nullable = false
type = list(string)
}
variable "eks_cluster_version" {
description = "EKS cluster kubernetes version"
nullable = false
type = string
}
推奨されるデプロイメントオプション
これは、すべての「必須」コンポーネントを作成し、Kubernetes Cluster に最新バージョンの W&B をインストールする、最もシンプルで標準的なデプロイメント設定です。
-
main.tf を作成します。
「一般的な手順」でファイルを作成したのと同じディレクトリーに、以下の内容で main.tf ファイルを作成します。
module "wandb_infra" {
source = "wandb/wandb/aws"
version = "~>7.0"
namespace = var.namespace
domain_name = var.domain_name
subdomain = var.subdomain
zone_id = var.zone_id
allowed_inbound_cidr = var.allowed_inbound_cidr
allowed_inbound_ipv6_cidr = var.allowed_inbound_ipv6_cidr
public_access = true
external_dns = true
kubernetes_public_access = true
kubernetes_public_access_cidrs = ["0.0.0.0/0"]
eks_cluster_version = var.eks_cluster_version
}
data "aws_eks_cluster" "eks_cluster_id" {
name = module.wandb_infra.cluster_name
}
data "aws_eks_cluster_auth" "eks_cluster_auth" {
name = module.wandb_infra.cluster_name
}
provider "kubernetes" {
host = data.aws_eks_cluster.eks_cluster_id.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.eks_cluster_id.certificate_authority.0.data)
token = data.aws_eks_cluster_auth.eks_cluster_auth.token
}
provider "helm" {
kubernetes {
host = data.aws_eks_cluster.eks_cluster_id.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.eks_cluster_id.certificate_authority.0.data)
token = data.aws_eks_cluster_auth.eks_cluster_auth.token
}
}
output "url" {
value = module.wandb_infra.url
}
output "bucket" {
value = module.wandb_infra.bucket_name
}
-
W&B をデプロイします。
W&B をデプロイするには、以下のコマンドを実行します。
terraform init
terraform apply -var-file=terraform.tfvars
REDIS の有効化
別のデプロイメントオプションとして、Redis を使用して SQL クエリをキャッシュし、Experiments のメトリクスを読み込む際のアプリケーションのレスポンスを高速化することができます。
キャッシュを有効にするには、推奨されるデプロイメントオプション セクションで説明したのと同じ main.tf ファイルに、オプション create_elasticache_subnet = true を追加する必要があります。
module "wandb_infra" {
source = "wandb/wandb/aws"
version = "~>7.0"
namespace = var.namespace
domain_name = var.domain_name
subdomain = var.subdomain
zone_id = var.zone_id
**create_elasticache_subnet = true**
}
[...]
メッセージブローカー(キュー)の有効化
デプロイメントオプション 3 は、外部の「メッセージブローカー」を有効化することです。W&B にはブローカーが組み込まれているため、これはオプションです。このオプションによってパフォーマンスが向上することはありません。
メッセージブローカーを提供する AWS リソースは SQS です。これを有効にするには、推奨されるデプロイメントオプション セクションで説明した main.tf に use_internal_queue = false オプションを追加する必要があります。
module "wandb_infra" {
source = "wandb/wandb/aws"
version = "~>7.0"
namespace = var.namespace
domain_name = var.domain_name
subdomain = var.subdomain
zone_id = var.zone_id
**use_internal_queue = false**
[...]
}
その他のデプロイメントオプション
これら 3 つのデプロイメントオプションをすべて組み合わせて、すべての設定を同じファイルに追加することも可能です。
Terraform Module は、標準的なオプションや「推奨デプロイメント」にある最小限の設定と組み合わせて使用できる、さまざまなオプションを提供しています。
手動設定
Amazon S3 バケットを W&B のファイルストレージバックエンドとして使用するには、以下の作業が必要です。
バケットを作成し、そのバケットからのオブジェクト作成通知を受け取るように設定された SQS キューを作成する必要があります。インスタンスには、このキューから読み取る権限が必要になります。
Amazon S3 バケットとバケット通知の作成
以下の手順に従って、Amazon S3 バケットを作成し、バケット通知を有効にします。
- AWS コンソールで Amazon S3 に移動します。
- バケットを作成 を選択します。
- 詳細設定 内の イベント セクションで 通知の追加 を選択します。
- すべてのオブジェクト作成イベントが、以前に設定した SQS キューに送信されるように設定します。
CORS アクセスを有効にします。CORS 設定は以下のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://YOUR-W&B-SERVER-IP</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
SQS キューの作成
以下の手順に従って SQS キューを作成します。
- AWS コンソールで Amazon SQS に移動します。
- キューを作成 を選択します。
- 詳細 セクションから 標準 キュータイプを選択します。
- アクセスポリシーセクションで、以下のプリンシパルに権限を追加します。
SendMessage
ReceiveMessage
ChangeMessageVisibility
DeleteMessage
GetQueueUrl
オプションで、アクセスポリシー セクションに高度なアクセスポリシーを追加します。たとえば、ステートメントを使用して Amazon SQS にアクセスするためのポリシーは以下の通りです。
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Principal" : "*",
"Action" : ["sqs:SendMessage"],
"Resource" : "<sqs-queue-arn>",
"Condition" : {
"ArnEquals" : { "aws:SourceArn" : "<s3-bucket-arn>" }
}
}
]
}
W&B を実行するノードへの権限付与
W&B サーバーが動作しているノードは、Amazon S3 および Amazon SQS へのアクセスを許可するように設定されている必要があります。選択したサーバーデプロイメントのタイプに応じて、ノードロールに以下のポリシー記述を追加する必要がある場合があります。
{
"Statement":[
{
"Sid":"",
"Effect":"Allow",
"Action":"s3:*",
"Resource":"arn:aws:s3:::<WANDB_BUCKET>"
},
{
"Sid":"",
"Effect":"Allow",
"Action":[
"sqs:*"
],
"Resource":"arn:aws:sqs:<REGION>:<ACCOUNT>:<WANDB_QUEUE>"
}
]
}
W&B サーバーの設定
最後に、W&B サーバーを設定します。
http(s)://YOUR-W&B-SERVER-HOST/system-admin にある W&B 設定ページに移動します。
- Use an external file storage backend オプションを有効にします。
- Amazon S3 バケット、リージョン、および Amazon SQS キューに関する情報を以下の形式で提供します。
- File Storage Bucket:
s3://<bucket-name>
- File Storage Region (AWS only):
<region>
- Notification Subscription:
sqs://<queue-name>
- Update settings を選択して、新しい設定を適用します。
W&B バージョンのアップグレード
W&B をアップデートするには、以下の手順に従ってください。
wandb_app モジュールの設定に wandb_version を追加します。アップグレードしたい W&B のバージョンを指定します。たとえば、次の行は W&B バージョン 0.48.1 を指定しています。
module "wandb_app" {
source = "wandb/wandb/kubernetes"
version = "~>1.0"
license = var.license
wandb_version = "0.48.1"
あるいは、terraform.tfvars に wandb_version を追加し、同じ名前の変数を作成して、リテラル値の代わりに var.wandb_version を使用することもできます。
- 設定を更新した後、推奨されるデプロイメントセクション で説明した手順を完了してください。
このセクションでは、terraform-aws-wandb モジュールを使用して、オペレーター導入前 (pre-operator) から オペレーター導入後 (post-operator) の環境にアップグレードするために必要な手順を詳しく説明します。
移行前後のアーキテクチャー
以前、W&B アーキテクチャーでは以下を使用していました。
module "wandb_infra" {
source = "wandb/wandb/aws"
version = "1.16.10"
...
}
インフラストラクチャーの制御:
および、W&B サーバーをデプロイするためのこのモジュール:
module "wandb_app" {
source = "wandb/wandb/kubernetes"
version = "1.12.0"
}
移行後、アーキテクチャーは以下を使用します。
module "wandb_infra" {
source = "wandb/wandb/aws"
version = "4.7.2"
...
}
インフラストラクチャーのインストールと Kubernetes クラスターへの W&B サーバーのデプロイの両方を管理するため、post-operator.tf における module "wandb_app" の必要性がなくなります。
このアーキテクチャーの変更により、SRE/インフラストラクチャーチームによる手動の Terraform 操作を必要とせずに、追加機能(OpenTelemetry、Prometheus、HPA、Kafka、イメージアップデートなど)を利用できるようになります。
W&B Pre-Operator のベースインストールから開始するには、post-operator.tf のファイル拡張子が .disabled になっており、pre-operator.tf が有効(.disabled 拡張子がない)であることを確認してください。これらのファイルは こちら にあります。
前提条件
移行プロセスを開始する前に、以下の前提条件が満たされていることを確認してください。
- エグレス (Egress): デプロイメントはエアギャップ環境であってはなりません。Release Channel の最新スペックを取得するために deploy.wandb.ai へのアクセスが必要です。
- AWS 認証情報: AWS リソースとやり取りするために適切に設定された AWS 認証情報。
- Terraform のインストール: 最新バージョンの Terraform がシステムにインストールされていること。
- Route53 ホストゾーン: アプリケーションが提供されるドメインに対応する既存の Route53 ホストゾーン。
- Pre-Operator Terraform ファイル:
pre-operator.tf および pre-operator.tfvars などの関連する変数ファイルが正しくセットアップされていること。
Pre-Operator のセットアップ
以下の Terraform コマンドを実行して、Pre-Operator セットアップの設定を初期化し、適用します。
terraform init -upgrade
terraform apply -var-file=./pre-operator.tfvars
pre-operator.tfvars は以下のようになります(例)。
namespace = "operator-upgrade"
domain_name = "sandbox-aws.wandb.ml"
zone_id = "Z032246913CW32RVRY0WU"
subdomain = "operator-upgrade"
wandb_license = "ey..."
wandb_version = "0.51.2"
pre-operator.tf 設定は 2 つのモジュールを呼び出します。
module "wandb_infra" {
source = "wandb/wandb/aws"
version = "1.16.10"
...
}
このモジュールがインフラを立ち上げます。
module "wandb_app" {
source = "wandb/wandb/kubernetes"
version = "1.12.0"
}
このモジュールがアプリケーションをデプロイします。
Post-Operator のセットアップ
pre-operator.tf に .disabled 拡張子が付いており、post-operator.tf がアクティブであることを確認してください。
post-operator.tfvars には追加の変数が含まれます。
...
# wandb_version = "0.51.2" は現在 Release Channel 経由で管理されるか、User Spec で設定されます。
# アップグレードに必要なオペレーター変数:
size = "small"
enable_dummy_dns = true
enable_operator_alb = true
custom_domain_filter = "sandbox-aws.wandb.ml"
以下のコマンドを実行して、Post-Operator 設定を初期化し、適用します。
terraform init -upgrade
terraform apply -var-file=./post-operator.tfvars
plan と apply のステップにより、以下のリソースが更新されます。
actions:
create:
- aws_efs_backup_policy.storage_class
- aws_efs_file_system.storage_class
- aws_efs_mount_target.storage_class["0"]
- aws_efs_mount_target.storage_class["1"]
- aws_eks_addon.efs
- aws_iam_openid_connect_provider.eks
- aws_iam_policy.secrets_manager
- aws_iam_role_policy_attachment.ebs_csi
- aws_iam_role_policy_attachment.eks_efs
- aws_iam_role_policy_attachment.node_secrets_manager
- aws_security_group.storage_class_nfs
- aws_security_group_rule.nfs_ingress
- random_pet.efs
- aws_s3_bucket_acl.file_storage
- aws_s3_bucket_cors_configuration.file_storage
- aws_s3_bucket_ownership_controls.file_storage
- aws_s3_bucket_server_side_encryption_configuration.file_storage
- helm_release.operator
- helm_release.wandb
- aws_cloudwatch_log_group.this[0]
- aws_iam_policy.default
- aws_iam_role.default
- aws_iam_role_policy_attachment.default
- helm_release.external_dns
- aws_default_network_acl.this[0]
- aws_default_route_table.default[0]
- aws_iam_policy.default
- aws_iam_role.default
- aws_iam_role_policy_attachment.default
- helm_release.aws_load_balancer_controller
update_in_place:
- aws_iam_policy.node_IMDSv2
- aws_iam_policy.node_cloudwatch
- aws_iam_policy.node_kms
- aws_iam_policy.node_s3
- aws_iam_policy.node_sqs
- aws_eks_cluster.this[0]
- aws_elasticache_replication_group.default
- aws_rds_cluster.this[0]
- aws_rds_cluster_instance.this["1"]
- aws_default_security_group.this[0]
- aws_subnet.private[0]
- aws_subnet.private[1]
- aws_subnet.public[0]
- aws_subnet.public[1]
- aws_launch_template.workers["primary"]
destroy:
- kubernetes_config_map.config_map
- kubernetes_deployment.wandb
- kubernetes_priority_class.priority
- kubernetes_secret.secret
- kubernetes_service.prometheus
- kubernetes_service.service
- random_id.snapshot_identifier[0]
replace:
- aws_autoscaling_attachment.autoscaling_attachment["primary"]
- aws_route53_record.alb
- aws_eks_node_group.workers["primary"]
以下のような表示が出るはずです。
post-operator.tf では、単一のモジュールになっていることに注意してください。
module "wandb_infra" {
source = "wandb/wandb/aws"
version = "4.7.2"
...
}
Post-Operator 設定の変更点:
- 必須プロバイダーの更新: プロバイダーの互換性のために
required_providers.aws.version を 3.6 から 4.0 に変更します。
- DNS とロードバランサーの設定:
enable_dummy_dns と enable_operator_alb を統合し、Ingress を通じて DNS レコードと AWS Load Balancer のセットアップを管理します。
- ライセンスとサイズの構成:
license および size パラメータを直接 wandb_infra モジュールに渡し、新しい運用要件に合わせます。
- カスタムドメインの処理: 必要に応じて、
custom_domain_filter を使用し、kube-system ネームスペース内の External DNS ポッドのログを確認して DNS トラブルシューティングを行います。
- Helm プロバイダーの設定: Kubernetes リソースを効果的に管理するために Helm プロバイダーを有効にして設定します。
provider "helm" {
kubernetes {
host = data.aws_eks_cluster.app_cluster.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.app_cluster.certificate_authority[0].data)
token = data.aws_eks_cluster_auth.app_cluster.token
exec {
api_version = "client.authentication.k8s.io/v1beta1"
args = ["eks", "get-token", "--cluster-name", data.aws_eks_cluster.app_cluster.name]
command = "aws"
}
}
}
この包括的なセットアップにより、オペレーターモデルによって可能になった新しい効率性と機能を活用し、Pre-Operator から Post-Operator 設定へのスムーズな移行が保証されます。