AWS Secrets Manager統合したAmazon FSx for Windows File Server環境をAWS CLIとCloudFormationで作成してみた

AWS Secrets Manager統合したAmazon FSx for Windows File Server環境をAWS CLIとCloudFormationで作成してみた

2025.12.02

しばたです。

先月月初にAmazon FSx for NetApp ONTAP(以後FSx ONTAP)とAmazon FSx for Windows Server(以後FSx Windows)のActive Directory認証情報がAWS Secrets Manager統合された旨のアップデートが発表されました。

https://dev.classmethod.jp/articles/amazon-fsx-integrate-with-aws-secrets-manager/

このアップデートによりFSx ONTAPとFSx WindowsにおいてセルフマネージドなActive Directory環境を使う際の認証情報にSecrets Managerのシークレットを指定可能となり直接パスワードを扱わずに済む様になりました。
これによりAWS CLIやCloudFormationといったツールからの環境構築をよりセキュアに実現できます。

本記事を書き始めた直後はCloudFormationがまだ更新に未対応だったのですが、2025年11月25日ごろにひっそりと対応されていたのでAWS CLIとCloudFormationの2種類のツールを使った構築手順を検証したいと思います。

0. 検証環境

今回の検証にはセルフマネージドなActive Directory環境が必要です。
以前公開したCloudFormationテンプレートを流用してVPCとWindows Server 2022 EC2のドメインコントローラー 1台を準備しておきます。

https://github.com/stknohg/amazon-workspaces-pack/tree/main/workspaces-trial-stack

ここにFSx Windows環境を構築し、最終的には下図のイメージとなります。

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-01

テンプレートによりVPCとドメインコントローラーは作成済み、また、こちらの記事を参考にFSx Windows環境の構築に必要な以下のリソースも作成済みの状態から開始します。

  • ドメイン名 : corp.contoso.com
  • FSx用OU : FSxForWin (識別名 : OU=FSxForWin,DC=corp,DC=contoso,DC=com)
  • FSxサービスアカウント(制御の委任済み) : FSxServiceAccount
  • FSx管理者グループ : FSxAdminGroup

1. KMSキーの準備

最初にSecrets Managerシークレットで使うKMSキーを作成します。
こちらはAWS CloudShellでCLIから作成し、今回はmy-fsx-windowsというエイリアスを割り当てています。

CloudShell
# KMSキー作成 : my-fsx-windows
kms_key_id=$(aws kms create-key --description 'Key for FSx for Windows File Server' \
    --key-usage 'ENCRYPT_DECRYPT' \
    --origin 'AWS_KMS' \
    --no-multi-region \
    --query 'KeyMetadata.KeyId' \
    --output text)
echo $kms_key_id 
# エイリアスの割り当て
aws kms create-alias --alias-name 'alias/my-fsx-windows' \
    --target-key-id $kms_key_id

続けてこのキーに対し下記ドキュメントを参考にSecrets Managerからアクセス可能にするキーポリシーを割り当てます。

CloudShell
#
# ※ポリシーの内容は環境に合わせて適宜変更が必要です
#

# 権限の追加 : 東京リージョン向け
# ref: https://docs.aws.amazon.com/fsx/latest/WindowsGuide/self-managed-AD.html#bp-store-ad-creds-using-secret-manager-windows
aws_account_id=$(aws sts get-caller-identity --query 'Account' --output text)
key_policy=$(cat << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::$aws_account_id:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow FSx to use the KMS key",
      "Effect": "Allow",
      "Principal": {
        "Service": "fsx.amazonaws.com"
      },
      "Action": [
        "kms:Decrypt",
        "kms:DescribeKey"
      ],
      "Resource": "arn:aws:kms:ap-northeast-1:$aws_account_id:key/*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "secretsmanager.ap-northeast-1.amazonaws.com",
          "aws:SourceAccount": "$aws_account_id"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:fsx:ap-northeast-1:$aws_account_id:file-system/*"
        }
      }
    }
  ]
}
EOF
)
aws kms put-key-policy --key-id $kms_key_id --policy "$key_policy"

最終的に下図の様な形になります。

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-02

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-03

2. Secrets Managerシークレットの準備

続けてSecrets Managerシークレットを作成します。
こちらもCloudShellからAWS CLIを使い以下の条件で作成します。

  • シークレット名 : my-fsx-for-windows-service-account
  • シークレット値 :
    • CUSTOMER_MANAGED_ACTIVE_DIRECTORY_USERNAMEキー = FSxServiceAccount
    • CUSTOMER_MANAGED_ACTIVE_DIRECTORY_PASSWORDキー = FSxServiceAccountアカウントのパスワード
  • KMS暗号化キー : my-fsx-windows (キーIDで指定)
CloudShell
# Secrets Manager シークレット作成
secret_arn=$(aws secretsmanager create-secret \
    --name "my-fsx-for-windows-service-account" \
    --description "Secrets for FSx for Windows File Server service account." \
    --secret-string "{\"CUSTOMER_MANAGED_ACTIVE_DIRECTORY_USERNAME\":\"FSxServiceAccount\",\"CUSTOMER_MANAGED_ACTIVE_DIRECTORY_PASSWORD\":\"P@ssw0rd\"}" \
    --kms-key-id $kms_key_id \
    --query 'ARN' \
    --output text)
echo $secret_arn

作成したシークレットのリソースポリシーを次の様に更新しFSxサービスからのアクセスを許可します。

CloudShell
# シークレットのリソースポリシー更新
aws_account_id=$(aws sts get-caller-identity --query 'Account' --output text)
resource_policy=$(cat << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "fsx.amazonaws.com"
      },
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": "$secret_arn",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "$aws_account_id"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:fsx:ap-northeast-1:$aws_account_id:file-system/*"
        }
      }
    }
  ]
}
EOF
)
aws secretsmanager put-resource-policy --secret-id $secret_arn --resource-policy "$resource_policy"

最終的に下図の様な形になっていればOKです。

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-04

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-05

3. AWS CLIを使った構築

これで前準備は完了したので、まずはAWS CLIでFSx Windowsのファイルシステムを作成してみます。

FSxファイルシステムの作成はaws fsx create-file-systemコマンドで行います。
FSx Windows環境を作る場合は--file-system-typeパラメーターをWINDOWSにして--windows-configurationに詳細情報を記述していく必要があります。

Secrets Managerのシークレット指定はさらにその中のSelfManagedActiveDirectoryConfigurationパラメーター中にあるDomainJoinServiceAccountSecretプロパティにシークレットのARNを渡してやる必要があります。
従来の方式ではUserNamePasswordプロパティを使いましたがシークレットを使う場合はこれらのパラメーターは未指定でOKです。

JSON形式で設定例を書くと次の様な感じです。

SelfManagedActiveDirectoryConfiguration設定例
"SelfManagedActiveDirectoryConfiguration": {
  "DomainName": "corp.contoso.com",
  "OrganizationalUnitDistinguishedName": "OU=FSxForWin,DC=corp,DC=contoso,DC=com",
  "FileSystemAdministratorsGroup": "FSxAdminGroup",
  "DnsIps": [
    "xx.xx.xx.xx"
  ],
  "DomainJoinServiceAccountSecret": "<シークレットのARN>"
},

この例を踏まえた全体像は下記の様になり、これをCloudShellから実行してやります。
FSxの作成には大量のパラメーター指定が必要なので--cli-input-jsonにJSONを渡す形にする方が良いでしょう。

今回の例ではSSD、Single AZ2な最低限の環境を作っています。

CloudShell
#
# 各種パラメーター指定は必要に応じて変更してください
#

secret_arn=$(aws secretsmanager list-secrets --filter Key="name",Values="my-fsx-for-windows-service-account" --query "SecretList[].ARN" --output text)
aws_account_id=$(aws sts get-caller-identity --query 'Account' --output text)
params=$(cat << EOF
{
  "FileSystemType": "WINDOWS",
  "StorageCapacity": 32,
  "StorageType": "SSD",
  "SubnetIds": [
    "subnet-xxxxxxxxxxxxxxxxxx"
  ],
  "SecurityGroupIds": [
    "sg-xxxxxxxxxxxxxxxxx"
  ],
  "KmsKeyId": "arn:aws:kms:ap-northeast-1:$aws_account_id:key/$(aws kms list-aliases --query "Aliases[?AliasName==\`alias/aws/fsx\`].TargetKeyId" --output text)",
  "WindowsConfiguration": {
    "SelfManagedActiveDirectoryConfiguration": {
      "DomainName": "corp.contoso.com",
      "OrganizationalUnitDistinguishedName": "OU=FSxForWin,DC=corp,DC=contoso,DC=com",
      "FileSystemAdministratorsGroup": "FSxAdminGroup",
      "DnsIps": [
        "10.0.1.77"
      ],
      "DomainJoinServiceAccountSecret": "$secret_arn"
    },
    "DeploymentType": "SINGLE_AZ_2",
    "ThroughputCapacity": 32,
    "AutomaticBackupRetentionDays": 1,
    "AuditLogConfiguration": {
      "FileAccessAuditLogLevel": "DISABLED",
      "FileShareAccessAuditLogLevel": "DISABLED"
    },
    "DiskIopsConfiguration": {
      "Mode": "AUTOMATIC"
    }
  },
  "NetworkType": "IPV4"
}
EOF
)
aws fsx create-file-system --cli-input-json "$params"

エラーなくコマンドが実行されればOKです。

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-06

作成完了まで待つとこんな感じで期待通りの環境が出来上がりました。

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-07

4. CloudFormationを使った構築

一旦作ったファイルシステムを削除して、今度はCloudFormationで作り直していきます。

FSxを表現するCloudFormationリソースはAWS::FSx::FileSystemとなり各種パラメーターの設定方法はおおむねAWS CLIと同じ感じです。

FSx Windows関連設定はWindowsConfiguration、さらにシークレット設定はSelfManagedActiveDirectoryConfigurationにあるDomainJoinServiceAccountSecretパラメーターで指定します。

AWS CLIの時と同様に設定例を出すと下記の通りです。

SelfManagedActiveDirectoryConfiguration設定例
SelfManagedActiveDirectoryConfiguration:
  DomainName: "corp.contoso.com"
  OrganizationalUnitDistinguishedName: "OU=FSxForWin,DC=corp,DC=contoso,DC=com"
  FileSystemAdministratorsGroup: "FSxAdminGroup"
  DnsIps:
    - "xx.xx.xx.xx"
  DomainJoinServiceAccountSecret: <シークレットのARN>

CloudFormationテンプレート全体としてはこんな感じです。
だいたいのパラメーターをAWS CLIと同様にしてますが、区別のためにこちらではNameタグを追記しています。

AWSTemplateFormatVersion: 2010-09-09
Description: My FSx for Windows File Server
Parameters:
  SecretARN:
    Description: "Secrets Manager Secret ARN"
    Type: String
    Default: arn:aws:secretsmanager:ap-northeast-1:xxxxxxxxxxxx:secret:my-fsx-for-windows-service-account-xxxxxx
Resources:
  MyFSxW:
    Type: AWS::FSx::FileSystem
    DeletionPolicy: Delete
    UpdateReplacePolicy: Delete
    Properties:
      FileSystemType: "WINDOWS"
      StorageCapacity: 32
      StorageType: "SSD"
      SubnetIds:
        - "subnet-xxxxxxxxxxxxxxxxx"
      SecurityGroupIds:
        - "sg-xxxxxxxxxxxxxxxxx"
      KmsKeyId: "alias/aws/fsx"
      WindowsConfiguration:
        SelfManagedActiveDirectoryConfiguration:
          DomainName: "corp.contoso.com"
          OrganizationalUnitDistinguishedName: "OU=FSxForWin,DC=corp,DC=contoso,DC=com"
          FileSystemAdministratorsGroup: "FSxAdminGroup"
          DnsIps:
            - "10.0.1.77"
          DomainJoinServiceAccountSecret:
            Ref: SecretARN
        DeploymentType: SINGLE_AZ_2
        ThroughputCapacity: 32
        AutomaticBackupRetentionDays: 1
        AuditLogConfiguration:
          FileAccessAuditLogLevel: "DISABLED"
          FileShareAccessAuditLogLevel: "DISABLED"
        DiskIopsConfiguration:
          Mode: "AUTOMATIC"
      NetworkType: "IPV4"
      Tags:
        - Key: Name
          Value: "my-fsxw-cfn"

このテンプレートからスタックを作ってやり

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-08

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-09

エラーなく作成できれば完了です。

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-10

how-to-create-secrets-manager-integrated-fsxw-with-cli-cfn-11

期待通りに作成できました。

最後に

以上となります。

シークレットの作成に少し手間はかかりますが、Secrets Manager統合のおかげで認証情報を直接扱わずにファイルシステムの構築ができました。
インフラ構築のコード化を行うのが非常にやりやすくなったので積極的に採用していくと良いでしょう。

この記事をシェアする

FacebookHatena blogX

関連記事