はじめに
こんにちは、mori (@morimori) です。
2025年の re:Invent で、Amazon FSx for NetApp ONTAP が S3 Access Points に対応するアップデートが発表されました。
これにより、FSx ONTAP のボリュームに S3 Access Point を紐付けることで、既存の S3 API をそのまま使って FSx ONTAP 上のデータにアクセスできるようになりました。
自分の仕事がクラウド中心にシフトしてから、ONTAP をはじめとするオンプレミスのストレージ製品とはほとんど縁がなくなっていました。クラウドネイティブなサービスを使うことが増え、関連するアップデートも気に留めなくなっていたのですが、直近の案件でたまたま Amazon FSx for NetApp ONTAP を触る機会があり、そこで目についたのがこのアップデートです。
実際に設定する機会がありましたので、この記事ではその内容を CloudFormation を使った構築手順としてまとめさせていただきます。
S3 Access Points とは
S3 Access Points は、S3 バケットへのアクセスを管理するための名前付きネットワークエンドポイントです。バケットポリシーを直接変更せずに、Access Point ごとにアクセス制御ポリシーを定義できます。また、VPC に紐付けることでインターネットからのアクセスを遮断し、VPC 内からのみアクセスを許可する構成も取れます。
NetApp ONTAP は SVM(Storage Virtual Machine)という単位で環境を分割でき、テナントやチームごとにセキュリティ境界を設けた構成が可能です。S3 Access Point はその配下のボリューム単位で作成するため、アクセス制御を細かく分離したうえで利用できます。
制約事項
試す前に、いくつかの制約を確認しておきます。
GetObject・PutObject・ListObjects / ListObjectsV2 といった基本的な S3 操作は利用できます。一方、GetBucketAcl / PutObjectAcl などの ACL 操作や、ListObjectVersions、RestoreObject などは対象外になります。詳細は公式ドキュメントを参照してください。
また、ECS on Fargate は FSx ONTAP ボリュームのネイティブマウントに対応していません。ECS から FSx ONTAP を使いたい場合は ECS on EC2 が選択肢になります。
ただし、S3 Access Points 経由であれば Fargate を含むあらゆるクライアントから S3 API でアクセスできます。アプリケーション側で AWS SDK を使うだけで、オンプレミス上の ONTAP ボリューム内のファイルを操作できるのは、実装コストの観点でも大きなメリットだと思います。
また、アクセスポイントのネットワークオリジン(Internet / VPC)は作成時にのみ指定可能で、作成後の変更はできません。VPC 制限を使う場合は設計段階で決めておく必要があります。
CloudFormation で構築する
AWS::FSx::S3AccessPointAttachment リソースを使って、FSx ONTAP ボリュームへの S3 Access Point を作成します。
AWSTemplateFormatVersion: '2010-09-09'
Description: FSx ONTAP S3 Access Point for SVM volume access
Parameters:
# FSx ONTAP Volume ID
VolumeId:
Description: "FSx for ONTAP Volume ID. Format: fsvol-xxxxxxxxxxxxxxxxx"
Type: String
AllowedPattern: '^fsvol-[0-9a-f]{17}$'
# File System Identity Type
FileSystemIdentityType:
Description: "File system identity type (UNIX or WINDOWS)"
Type: String
Default: UNIX
AllowedValues:
- UNIX
- WINDOWS
# UNIX User Name (required if FileSystemIdentityType is UNIX)
UnixUserName:
Description: "UNIX user name for file system operations (required if FileSystemIdentityType is UNIX)"
Type: String
Default: ""
AllowedPattern: '^$|^[^\u0000\u0085\u2028\u2029\r\n]{1,256}$'
# Windows User Name (required if FileSystemIdentityType is WINDOWS)
WindowsUserName:
Description: "Windows user name for file system operations (required if FileSystemIdentityType is WINDOWS). Can be domain\\user format."
Type: String
Default: ""
AllowedPattern: '^$|^[^\u0000\u0085\u2028\u2029\r\n]{1,256}$'
# S3 Access Point Name
S3AccessPointName:
Description: "Name of the S3 access point (3-50 characters, lowercase alphanumeric and hyphens only)"
Type: String
Default: ""
AllowedPattern: '^$|^(?=[a-z0-9])[a-z0-9-]{1,48}[a-z0-9]$'
# VPC Configuration (optional)
VpcId:
Description: "VPC ID to restrict S3 access point access (optional). If not provided, access point will be accessible from internet."
Type: String
Default: ""
AllowedPattern: '^$|^vpc-[0-9a-f]{8,}$'
# S3 Access Point Policy (optional)
S3AccessPointPolicy:
Description: "S3 access point policy in JSON format (optional)"
Type: String
Default: ""
AllowedPattern: '^$|.*'
Conditions:
UseUnixUser: !Equals [!Ref FileSystemIdentityType, "UNIX"]
UseWindowsUser: !Equals [!Ref FileSystemIdentityType, "WINDOWS"]
UseVpcConfiguration: !Not [!Equals [!Ref VpcId, ""]]
UseAccessPointPolicy: !Not [!Equals [!Ref S3AccessPointPolicy, ""]]
UseS3AccessPointName: !Not [!Equals [!Ref S3AccessPointName, ""]]
UseVpcConfigurationOrPolicy: !Or
- !Condition UseVpcConfiguration
- !Condition UseAccessPointPolicy
Resources:
FsxOntapS3AccessPointAttachment:
Type: AWS::FSx::S3AccessPointAttachment
Properties:
Name: !If
- UseS3AccessPointName
- !Ref S3AccessPointName
- fsx-ontap-s3-access-point
Type: ONTAP
OntapConfiguration:
VolumeId: !Ref VolumeId
FileSystemIdentity:
Type: !Ref FileSystemIdentityType
UnixUser: !If
- UseUnixUser
- Name: !Ref UnixUserName
- !Ref "AWS::NoValue"
WindowsUser: !If
- UseWindowsUser
- Name: !Ref WindowsUserName
- !Ref "AWS::NoValue"
S3AccessPoint: !If
- UseVpcConfigurationOrPolicy
- !If
- UseVpcConfiguration
- !If
- UseAccessPointPolicy
- VpcConfiguration:
VpcId: !Ref VpcId
Policy: !Ref S3AccessPointPolicy
- VpcConfiguration:
VpcId: !Ref VpcId
- !If
- UseAccessPointPolicy
- Policy: !Ref S3AccessPointPolicy
- !Ref "AWS::NoValue"
- !Ref "AWS::NoValue"
Outputs:
FsxOntapS3AccessPointAttachmentId:
Description: "FSx ONTAP S3 Access Point Attachment ID"
Value: !Ref FsxOntapS3AccessPointAttachment
Export:
Name: fsx-ontap-s3-access-point-attachment-id
FsxOntapS3AccessPointArn:
Description: "S3 Access Point ARN"
Value: !GetAtt FsxOntapS3AccessPointAttachment.S3AccessPoint.ResourceARN
Export:
Name: fsx-ontap-s3-access-point-arn
FsxOntapS3AccessPointAlias:
Description: "S3 Access Point Alias (DNS alias for accessing the access point)"
Value: !GetAtt FsxOntapS3AccessPointAttachment.S3AccessPoint.Alias
Export:
Name: fsx-ontap-s3-access-point-alias
パラメータの説明
| パラメータ | 必須 | 説明 |
|---|---|---|
VolumeId |
必須 | 対象の FSx ONTAP ボリューム ID(fsvol-xxx 形式) |
FileSystemIdentityType |
必須 | アクセス時のユーザー種別(UNIX or WINDOWS) |
UnixUserName |
任意 | UNIX ユーザー名(FileSystemIdentityType が UNIX の場合に指定) |
WindowsUserName |
任意 | Windows ユーザー名(FileSystemIdentityType が WINDOWS の場合に指定) |
S3AccessPointName |
任意 | Access Point 名。省略時は fsx-ontap-s3-access-point
|
VpcId |
任意 | 指定すると VPC 内からのアクセスに限定。未指定の場合はインターネットからアクセス可能になるため注意 |
S3AccessPointPolicy |
任意 | S3 バケットポリシー相当の JSON |
Outputs の使い方
スタックのデプロイ後、以下の値が出力されます。
-
S3 Access Point ARN — SDK や CLI からアクセスする際に
--access-pointオプションで指定します -
S3 Access Point Alias —
<alias>.s3-accesspoint.<region>.amazonaws.com形式の DNS エイリアス。S3 バケット名の代わりにそのまま使えます
まとめ
今回は FSx for NetApp ONTAP の S3 Access Points 対応を CloudFormation で試してみました。AWS::FSx::S3AccessPointAttachment リソースを使うだけで構築でき、VPC 制限やアクセスポリシーも合わせて設定できます。
今回は CloudFormation での構築手順を紹介しましたが、マネジメントコンソールの GUI からも数ステップで同様の設定が可能です。まず試してみたい場合は GUI から操作するのが手軽でおすすめです。
クラウドへの移行が進む一方で、Windows と Linux の混在環境や既存の NAS 資産を抱えている現場では、すべてをクラウドネイティブに置き換えることが難しいケースもあります。そういった環境では FSx for NetApp ONTAP のように SMB / NFS の両プロトコルに対応したストレージを活用することが有効な選択肢になります。今回のアップデートにより、そこに S3 API 経由のアクセスも加わったことで、アプリケーション側の実装の幅がさらに広がったと感じています。
ファイルサーバーといえば「VPC の中」「イントラネットの中」というイメージが強かったですが、SVM 単位で環境を分割しセキュリティ境界を設けたうえで、Access Point ごとにアクセスポリシーを細かく制御することで、インターネット経由での外部アカウントとの連携や、SDK を使った他 VPC・他アカウントからのアクセスも安全に実現できます。データを一箇所に集約しながら、複数の環境やアカウントから柔軟に利用できる可能性が見えたのは、個人的にとても面白いと感じたポイントでした。
インフラエンジニアとして、今後もストレージ周りを深掘りしていきたいと思います。