AWS DataSync Discovery が発表されました (パブリックプレビュー)

2022.10.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ファイルサーバーを移行したい

こんにちは、のんピ(@non____97)です。

皆さんはファイルサーバーの移行をしたことはありますか? 私はあります。

一言にファイルサーバーと言っても、用途や利用者数、データサイズ、パフォーマンスはまちまちです。

そのためファイルサーバーを移行する際は、まず上述のようなことをヒアリングすることになります。ただ、お客さんにヒアリングしてもお客さん自身も把握しておらず、なかなか前に進まないことがあると思います。

そんな折、パブリックプレビューですがAWS DataSync Discovery が発表されました。

本日、AWS DataSync Discovery のパブリックプレビューを発表します。DataSync Discovery を使用すると、オンプレミスのストレージパフォーマンスと使用状況が可視化され、AWS へのデータ移行の簡素化および加速に役立つ、自動レコメンデーションを受け取ります。

とあるので、ファイルサーバーの移行に大活躍間違いなしですね。

AWS公式ブログも投稿されていますね。

早速調べて使ってみたので紹介します。

いきなりまとめ

  • AWS DataSync Discoveryの機能は以下の2つ
    1. ファイルサーバーのパフォーマンスと使用状況の可視化
    2. AWS上に移行する場合に採用するストレージサービスと設定のレコメンド
  • DataSync Discoveryで取得できる情報は以下
    • ストレージサイズ
    • 使用済みストレージサイズ
    • NFSおよびSMBのクライアントの数
    • IOPS
    • ボリューム構成
    • ボリュームスループット
    • ボリュームのレイテンシ
    • DataSync DiscoveryはDataSyncエージェントを介して動作
  • 検出ジョブを実行する際は1日から31日までの期間を指定する
    • 検出ジョブの実行期間が長いほどより正確なレコメンデーションを得られる
  • 検出ジョブで収集した情報はジョブの終了後最大60日間参照できる
  • レコメンデーションされるサービスは以下の3つ
    1. Amazon FSx for NetApp ONTAP
    2. Amazon Elastic File System (Amazon EFS)
    3. Amazon FSx for Windows File Server
  • 2022/10/4現在の制限事項
    • DataSync Discovery はバージニア北部リージョン(us-east-1)でのみ使用可能
    • パブリック サービス エンドポイントのみをサポート
    • AWS アカウントおよび AWS リージョンごとに設定できるストレージシステムは最大10個
    • DataSync エージェントは、一度に最大4つのストレージ システムにアクセス可能
    • ONTAP 9.8 以降を実行している NetApp Fabric-Attached Storage (FAS) および All Flash FAS (AFF) システムをサポート
    • DataSync Discovery で使用するエージェントには、80 GB のディスク容量と 16 GB の RAM が必要

DataSync Discoveryとは

DataSync Discoveryとは、接続したファイルサーバーのパフォーマンスと使用状況を可視化し、AWS上に移行する場合に採用するストレージサービスと設定をレコメンドするサービスです。

AWS Application Discovery Serviceのファイルサーバー特化版のようなイメージです。

気になる取得できる情報は以下の通りです。

  • ストレージサイズ
  • 使用済みストレージサイズ
  • NFSおよびSMBのクライアントの数
  • IOPS
  • ボリューム構成
  • ボリュームスループット
  • ボリュームのレイテンシ

DataSync DiscoveryはDataSyncエージェントを介して動作します。DataSyncエージェントからファイルサーバーに管理インターフェイスに接続してモニタリングする形です。

DataSync Discovery architecture

抜粋 : Understanding your storage with AWS DataSync Discovery - AWS DataSync

モニタリングする際は検出ジョブ(Discovery job)を実行します。

検出ジョブを実行する際は1日から31日までの期間を指定します。検出ジョブの実行期間が長いほどより正確なレコメンデーションを得られます。

また、検出ジョブで収集した情報はジョブの終了後最大60日間参照できるようです。

You can run a discovery job for up to 31 days. A storage system can have only one active discovery job at a time. The information that a discovery job collects is available for up to 60 days following the end of the job (unless you remove the related storage system from DataSync Discovery before that).

Working with DataSync discovery jobs - AWS DataSync

レコメンデーションされるサービスは以下の3つです

  1. Amazon FSx for NetApp ONTAP
  2. Amazon Elastic File System (Amazon EFS)
  3. Amazon FSx for Windows File Server

レコメンデーションには使用するストレージサービスとIOPSやサイズなどの構成と、その構成を採用した場合の月額料金が表示されます。

一方、レコメンデーションは以下について考慮されていないので、注意が必要です。

  1. Amazon FSx for NetApp ONTAP
    • Single-AZ配置とバックアップストレージ
  2. Amazon Elastic File System (Amazon EFS)
    • One Zoneストレージクラスとバックアップストレージ
  3. Amazon FSx for Windows File Server
    • Single-AZ配置とバックアップストレージ

なお、DataSync Discovery自体の料金はかからないようです。Secrets ManagerとDataSyncエージェントが必須なので、DataSync Discoveryを試す場合はそちらの料金が発生することを認識しておきましょう。

AWS DataSync Discovery (プレビュー) を使用すると、最大 31 日間検出ジョブを実行し、レコメンデーションを無料で受け取ることができます。DataSync Discovery は、ジョブの完了後 60 日間、収集されたデータと関連するレコメンデーションを保持します。

. . (中略) . .

DataSync Discovery (プレビュー) を使用すると、AWS Secrets Manager によって、オンプレミスストレージシステムの認証情報を保存するために作成したシークレットと、シークレットにアクセスするために DataSync によって実行されたすべての Secrets Manager API コールの料金が請求されます。

料金 - AWS DataSync | AWS

制限事項の確認

2022/10/4現在、いくつか制限事項があります。

  • DataSync Discovery はバージニア北部リージョン(us-east-1)でのみ使用可能
  • パブリック サービス エンドポイントのみをサポート
  • AWS アカウントおよび AWS リージョンごとに設定できるストレージシステムは最大10個
  • DataSync エージェントは、一度に最大4つのストレージ システムにアクセス可能
  • ONTAP 9.8 以降を実行している NetApp Fabric-Attached Storage (FAS) および All Flash FAS (AFF) システムをサポート
  • DataSync Discovery で使用するエージェントには、80 GB のディスク容量と 16 GB の RAM が必要

参考 :

パブリックプレビューなので制限事項が多いのはしょうがないですね。GAまでに制限が緩和されていることを祈りましょう。

検証環境

検証環境は以下の通りです。

検証構成図

オンプレミス環境にONTAPを用意することはとてもできないので、FSx for ONTAPで代用しています。

DataSyncエージェントからFSx for ONTAPにONTAP APIでアクセスしてモニタリングします。モニタリング中EC2インスタンスからFSx for ONTAPに対して読み書きを行い、DataSync Discoveryがどのように検出するのか確認してみます。

やってみる

FSx for ONTAPの構築

それではまず、FSx for ONTAPを構築します。

以下リポジトリを参考にAWS CDKでデプロイします。

DataSync Discoveryからファイルサーバーに接続する際、ファイルサーバーの管理社の認証情報のSecrets Managerを保存しておく必要があります。また、暗号化に使うKMSキーはAWSマネージドキーは使えないようなので、自分でCMKを作成します。

キーポリシーやシークレットのポリシーは以下AWS公式ドキュメントを参考に設定します。

最終的には以下のようなコードになりました。

./lib/fsx-for-ontap-stack.ts

import {
  Stack,
  StackProps,
  CfnDynamicReference,
  CfnDynamicReferenceService,
  aws_iam as iam,
  aws_ec2 as ec2,
  aws_kms as kms,
  aws_secretsmanager as secretsmanager,
  aws_fsx as fsx,
} from "aws-cdk-lib";
import { Construct } from "constructs";

export class FsxForOntapStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // SSM IAM Role
    const ssmIamRole = new iam.Role(this, "SSM IAM Role", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
      managedPolicies: [
        iam.ManagedPolicy.fromAwsManagedPolicyName(
          "AmazonSSMManagedInstanceCore"
        ),
      ],
    });

    // VPC
    const vpc = new ec2.Vpc(this, "VPC", {
      cidr: "10.0.1.0/24",
      enableDnsHostnames: true,
      enableDnsSupport: true,
      natGateways: 0,
      maxAzs: 1,
      subnetConfiguration: [
        {
          name: "Public",
          subnetType: ec2.SubnetType.PUBLIC,
          cidrMask: 27,
        },
        {
          name: "Isolated",
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
          cidrMask: 27,
        },
      ],
    });

    // EC2 Instance
    const instance = new ec2.Instance(this, "EC2 Instance", {
      instanceType: new ec2.InstanceType("t3.micro"),
      machineImage: ec2.MachineImage.latestAmazonLinux({
        generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      }),
      vpc,
      blockDevices: [
        {
          deviceName: "/dev/xvda",
          volume: ec2.BlockDeviceVolume.ebs(8, {
            volumeType: ec2.EbsDeviceVolumeType.GP3,
          }),
        },
      ],
      propagateTagsToVolumeOnCreation: true,
      vpcSubnets: vpc.selectSubnets({
        subnetType: ec2.SubnetType.PUBLIC,
      }),
      role: ssmIamRole,
    });

    // Security Group used by FSx for ONTAP file system
    const fileSystemSecurityGroup = new ec2.SecurityGroup(
      this,
      "Security Group of FSx for ONTAP file system",
      {
        vpc,
      }
    );

    // Ref : https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/limit-access-security-groups.html
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.icmpPing(),
      "Pinging the instance"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(22),
      "SSH access to the IP address of the cluster management LIF or a node management LIF"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(111),
      "Remote procedure call for NFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(135),
      "Remote procedure call for CIFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(139),
      "NetBIOS service session for CIFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcpRange(161, 162),
      "Simple network management protocol (SNMP)"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(443),
      "ONTAP REST API access to the IP address of the cluster management LIF or an SVM management LIF"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(445),
      "Microsoft SMB/CIFS over TCP with NetBIOS framing"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(635),
      "NFS mount"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(749),
      "Kerberos"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(2049),
      "NFS server daemon"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(3260),
      "iSCSI access through the iSCSI data LIF"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(4045),
      "NFS lock daemon"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(4046),
      "Network status monitor for NFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(10000),
      "Network data management protocol (NDMP) and NetApp SnapMirror intercluster communication"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(11104),
      "Management of NetApp SnapMirror intercluster communication"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.tcp(11105),
      "SnapMirror data transfer using intercluster LIFs"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(111),
      "Remote procedure call for NFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(135),
      "Remote procedure call for CIFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(137),
      "NetBIOS name resolution for CIFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(139),
      "NetBIOS service session for CIFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udpRange(161, 162),
      "Simple network management protocol (SNMP)"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(635),
      "NFS mount"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(2049),
      "NFS server daemon"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(4045),
      "NFS lock daemon"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(4046),
      "Network status monitor for NFS"
    );
    fileSystemSecurityGroup.addIngressRule(
      ec2.Peer.ipv4(vpc.vpcCidrBlock),
      ec2.Port.udp(4049),
      "NFS quota protocol"
    );

    // Secrets CMK
    const secretsCMK = new kms.Key(this, "Secrets CMK", {
      admins: [
        iam.Role.fromRoleArn(
          this,
          "Imported Role",
          "<管理用IAMロールのARN>",
          { mutable: false }
        ),
      ],
      alias: "secrets-cmk",
      enableKeyRotation: true,
      keySpec: kms.KeySpec.SYMMETRIC_DEFAULT,
      keyUsage: kms.KeyUsage.ENCRYPT_DECRYPT,
    });

    secretsCMK.addToResourcePolicy(
      new iam.PolicyStatement({
        effect: iam.Effect.ALLOW,
        principals: [
          new iam.ServicePrincipal("discovery-datasync.amazonaws.com"),
        ],
        actions: ["kms:Decrypt", "kms:DescribeKey"],
        resources: ["*"],
      })
    );

    // Secret of FSx for ONTAP file system
    const fileSystemSecret = new secretsmanager.Secret(
      this,
      "Secret of FSx for ONTAP file system",
      {
        secretName: "/fsx-for-ontap/file-system/fsxadmin",
        encryptionKey: secretsCMK,
        generateSecretString: {
          generateStringKey: "password",
          passwordLength: 32,
          requireEachIncludedType: true,
          secretStringTemplate: '{"username": "fsxadmin"}',
        },
      }
    );

    fileSystemSecret.addToResourcePolicy(
      new iam.PolicyStatement({
        effect: iam.Effect.ALLOW,
        principals: [
          new iam.ServicePrincipal("discovery-datasync.amazonaws.com"),
        ],
        actions: ["secretsmanager:GetSecretValue"],
        resources: ["*"],
        conditions: {
          StringEquals: {
            "aws:SourceAccount": this.account,
          },
          ArnLike: {
            "aws:SourceArn": `arn:aws:datasync:${this.region}:${this.account}:system/*`,
          },
        },
      })
    );

    // FSx for ONTAP file system
    const fsxForOntapFileSystem = new fsx.CfnFileSystem(
      this,
      "FSx for ONTAP file system",
      {
        fileSystemType: "ONTAP",
        subnetIds: vpc.selectSubnets({
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
        }).subnetIds,
        ontapConfiguration: {
          deploymentType: "SINGLE_AZ_1",
          automaticBackupRetentionDays: 7,
          dailyAutomaticBackupStartTime: "16:00",
          diskIopsConfiguration: {
            mode: "AUTOMATIC",
          },
          fsxAdminPassword: new CfnDynamicReference(
            CfnDynamicReferenceService.SECRETS_MANAGER,
            `${fileSystemSecret.secretArn}:SecretString:password`
          ).toString(),
          throughputCapacity: 128,
          weeklyMaintenanceStartTime: "6:17:00",
        },
        securityGroupIds: [fileSystemSecurityGroup.securityGroupId],
        storageCapacity: 1024,
        storageType: "SSD",
        tags: [
          {
            key: "Name",
            value: "fsx-for-ontap-file-system",
          },
        ],
      }
    );

    // FSx for ONTAP SVM
    const svmName = "fsx-for-ontap-svm";
    const svm = new fsx.CfnStorageVirtualMachine(this, "SVM", {
      fileSystemId: fsxForOntapFileSystem.ref,
      name: svmName,
      rootVolumeSecurityStyle: "MIXED",
      tags: [
        {
          key: "Name",
          value: svmName,
        },
      ],
    });

    // FSX for ONTAP volume
    const volumeName = "fsx_for_ontap_volume";
    const junctionPath = "/volume";
    new fsx.CfnVolume(this, "Volume", {
      name: volumeName,
      ontapConfiguration: {
        junctionPath,
        sizeInMegabytes: "102400",
        storageEfficiencyEnabled: "true",
        storageVirtualMachineId: svm.ref,
        securityStyle: "UNIX",
        tieringPolicy: {
          coolingPeriod: 31,
          name: "AUTO",
        },
      },
      tags: [
        {
          key: "Name",
          value: volumeName,
        },
      ],
      volumeType: "ONTAP",
    });

    instance.userData.addCommands(
      "yum check-update -y",
      "yum upgrade -y",
      "file_system_id=" + fsxForOntapFileSystem.ref,
      "svm_id=" + svm.ref,
      "fsx_mount_point=/mnt/fsx",
      "junction_path=" + junctionPath,
      'mkdir -p "${fsx_mount_point}"',
      'echo "${svm_id}.${file_system_id}.fsx.' +
        Stack.of(this).region +
        '.amazonaws.com:${junction_path} ${fsx_mount_point} nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0" >> /etc/fstab',
      "echo 'preserve_hostname: true' >> /etc/cloud/cloud.cfg",
      "hostnamectl set-hostname ec2-instance.corp.non-97.net",
      "systemctl reboot"
    );
  }
}

DataSyncエージェント用EC2インスタンスの作成

次にDataSyncエージェント用EC2インスタンスを作成します。

まず、DataSyncエージェントで使えるAMIのIDを確認します。

$ aws ssm get-parameter --name /aws/service/datasync/ami
{
    "Parameter": {
        "Name": "/aws/service/datasync/ami",
        "Type": "String",
        "Value": "ami-06dffdffeed1ce3c9",
        "Version": 62,
        "LastModifiedDate": "2022-09-28T21:09:54.950000+00:00",
        "ARN": "arn:aws:ssm:us-east-1::parameter/aws/service/datasync/ami",
        "DataType": "text"
    }
}

こちらのAMIを選択します。

DataSyncエージェントのAMIを選択

16 GBのメモリが必要とのことだったので、インスタンスタイプはm6i.xlargeを選択します。

インスタンスタイプを選択

アクティベーションのために自身のIPアドレスからHTTPで通信できる必要があるため、パブリックIPアドレスを割り当てます。また、セキュリティグループで自身のIPアドレスからHTTPで通信できるように許可します。

ネットワーク設定

ボリュームタイプはデフォルトでgp2だったのでgp3に変更しました。

ボリュームの設定

少しでもコストを下げたいのでスポットインスタンスで作成します。また、SSMセッションマネージャーで接続できるようにAmazonSSMManagedInstanceCoreポリシーが割りあたっているIAMインスタンスプロファイルをアタッチします。

高度な詳細

これでEC2インスタンスを作成します。

作成後、SSMセッションマネージャーで接続します。

$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

$ uname -r
5.4.209-116.367.amzn2.x86_64

以前のDataSyncエージェントのEC2インスタンスはAmazon Linuxベースでしたが、最近はAmazon Linux 2ベースのようです。

DataSyncエージェントのアクティベート

DataSyncエージェントのアクティベートを行います。

DataSyncのコンソールからエージェント-エージェントを作成するをクリックします。

エージェントを作成する

先ほど作成したDataSyncエージェントのEC2インスタンスのパブリックIPアドレスを入力して、キーを取得するをクリックします。

キーを取得する

アクティベーションキーを取得できたことを確認して、エージェントを作成するをクリックします。

エージェントを作成する

DataSyncエージェントが認識されたことを確認します。

作成されたDataSyncエージェントの確認

アクティベーション後、DataSyncエージェントにSSMセッションマネージャーで接続して使用しているポートやプロセスを眺めます。

$ sudo ss -antup
Netid     State      Recv-Q     Send-Q         Local Address:Port            Peer Address:Port     Process
udp       UNCONN     0          0                    0.0.0.0:68                   0.0.0.0:*         users:(("dhclient",pid=2443,fd=6))
udp       UNCONN     0          0                    0.0.0.0:111                  0.0.0.0:*         users:(("rpcbind",pid=2196,fd=6))
udp       UNCONN     0          0                  127.0.0.1:323                  0.0.0.0:*         users:(("chronyd",pid=2201,fd=5))
udp       UNCONN     0          0                    0.0.0.0:657                  0.0.0.0:*         users:(("rpcbind",pid=2196,fd=7))
udp       UNCONN     0          0                       [::]:111                     [::]:*         users:(("rpcbind",pid=2196,fd=9))
udp       UNCONN     0          0                      [::1]:323                     [::]:*         users:(("chronyd",pid=2201,fd=6))
udp       UNCONN     0          0                       [::]:657                     [::]:*         users:(("rpcbind",pid=2196,fd=10))
tcp       LISTEN     0          128                  0.0.0.0:111                  0.0.0.0:*         users:(("rpcbind",pid=2196,fd=8))
tcp       LISTEN     0          128                  0.0.0.0:22                   0.0.0.0:*         users:(("sshd",pid=3053,fd=3))
tcp       LISTEN     0          100                127.0.0.1:25                   0.0.0.0:*         users:(("master",pid=2898,fd=13))
tcp       LISTEN     0          50                 127.0.0.1:9090                 0.0.0.0:*         users:(("java",pid=3715,fd=46))
tcp       LISTEN     0          1024               127.0.0.1:9091                 0.0.0.0:*         users:(("fmrsd",pid=3841,fd=9))
tcp       ESTAB      0          0                  10.0.1.30:33460          52.46.143.242:443       users:(("ssm-agent-worke",pid=3381,fd=13))
tcp       ESTAB      0          0                  10.0.1.30:48380          35.175.166.48:443       users:(("java",pid=3715,fd=47))
tcp       ESTAB      0          0                  10.0.1.30:48352          35.175.166.48:443       users:(("java",pid=3715,fd=50))
tcp       ESTAB      0          0                  10.0.1.30:55806           3.226.119.21:443       users:(("java",pid=3715,fd=49))
tcp       ESTAB      0          0                  10.0.1.30:48350          35.175.166.48:443       users:(("java",pid=3715,fd=48))
tcp       ESTAB      0          0                  10.0.1.30:48366          35.175.166.48:443       users:(("java",pid=3715,fd=52))
tcp       ESTAB      0          0                  10.0.1.30:57608          209.54.182.89:443       users:(("ssm-agent-worke",pid=3381,fd=16))
tcp       ESTAB      0          0                  10.0.1.30:53064          209.54.182.89:443       users:(("ssm-session-wor",pid=3411,fd=16))
tcp       ESTAB      0          0                  10.0.1.30:55798           3.226.119.21:443       users:(("java",pid=3715,fd=51))
tcp       LISTEN     0          128                     [::]:111                     [::]:*         users:(("rpcbind",pid=2196,fd=11))
tcp       LISTEN     0          128                     [::]:22                      [::]:*         users:(("sshd",pid=3053,fd=4))

$ sudo lsof -i -P
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind   2196      rpc    6u  IPv4  17667      0t0  UDP *:111
rpcbind   2196      rpc    7u  IPv4  17668      0t0  UDP *:657
rpcbind   2196      rpc    8u  IPv4  17669      0t0  TCP *:111 (LISTEN)
rpcbind   2196      rpc    9u  IPv6  17670      0t0  UDP *:111
rpcbind   2196      rpc   10u  IPv6  17671      0t0  UDP *:657
rpcbind   2196      rpc   11u  IPv6  17672      0t0  TCP *:111 (LISTEN)
chronyd   2201   chrony    5u  IPv4  15052      0t0  UDP localhost:323
chronyd   2201   chrony    6u  IPv6  15053      0t0  UDP localhost6:323
dhclient  2443     root    6u  IPv4  15221      0t0  UDP *:68
master    2898     root   13u  IPv4  21579      0t0  TCP localhost:25 (LISTEN)
sshd      3053     root    3u  IPv4  19218      0t0  TCP *:22 (LISTEN)
sshd      3053     root    4u  IPv6  19220      0t0  TCP *:22 (LISTEN)
ssm-agent 3381     root   13u  IPv4  33747      0t0  TCP ip-10-0-1-30.ec2.internal:48356->52.46.143.242:443 (ESTABLISHED)
ssm-agent 3381     root   16u  IPv4  22777      0t0  TCP ip-10-0-1-30.ec2.internal:57608->209.54.182.89:443 (ESTABLISHED)
ssm-sessi 3411     root   16u  IPv4  25686      0t0  TCP ip-10-0-1-30.ec2.internal:53064->209.54.182.89:443 (ESTABLISHED)
java      3715 sgserver   46u  IPv4  27724      0t0  TCP localhost:9090 (LISTEN)
java      3715 sgserver   47u  IPv4  26330      0t0  TCP ip-10-0-1-30.ec2.internal:48380->ec2-35-175-166-48.compute-1.amazonaws.com:443 (ESTABLISHED)
java      3715 sgserver   48u  IPv4  27413      0t0  TCP ip-10-0-1-30.ec2.internal:48350->ec2-35-175-166-48.compute-1.amazonaws.com:443 (ESTABLISHED)
java      3715 sgserver   49u  IPv4  26331      0t0  TCP ip-10-0-1-30.ec2.internal:55806->ec2-3-226-119-21.compute-1.amazonaws.com:443 (ESTABLISHED)
java      3715 sgserver   50u  IPv4  27414      0t0  TCP ip-10-0-1-30.ec2.internal:48352->ec2-35-175-166-48.compute-1.amazonaws.com:443 (ESTABLISHED)
java      3715 sgserver   51u  IPv4  28714      0t0  TCP ip-10-0-1-30.ec2.internal:55798->ec2-3-226-119-21.compute-1.amazonaws.com:443 (ESTABLISHED)
java      3715 sgserver   52u  IPv4  27415      0t0  TCP ip-10-0-1-30.ec2.internal:48366->ec2-35-175-166-48.compute-1.amazonaws.com:443 (ESTABLISHED)
fmrsd     3841     root    9u  IPv4  28824      0t0  TCP localhost:9091 (LISTEN)

$ pstree -a
systemd --switched-root --system --deserialize 21
  ├─acpid
  ├─agetty --keep-baud 115200,38400,9600 ttyS0 vt220
  ├─agetty --noclear tty1 linux
  ├─amazon-ssm-agen
  │   ├─ssm-agent-worke
  │   │   ├─ssm-session-wor <IAMロール名>-0903552fde8cf4243
  │   │   │   ├─sh
  │   │   │   │   └─pstree -a
  │   │   │   └─10*[{ssm-session-wor}]
  │   │   └─11*[{ssm-agent-worke}]
  │   └─9*[{amazon-ssm-agen}]
  ├─atd -f
  ├─auditd
  │   └─{auditd}
  ├─chronyd -F 2
  ├─crond -n
  │   └─crond -n
  │       └─sh -c $WORKING_DIR/scripts/systemd-log-rotate >/dev/null 2>&1
  │           └─systemd-log-rot /usr/local/aws-storage-gateway/scripts/systemd-log-rotate
  │               └─redirect-system /usr/local/aws-storage-gateway/scripts/redirect-systemd-log
  │                   └─journalctl -q -f
  ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
  ├─dhclient -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid eth0
  ├─fmrsd
  │   └─228*[{fmrsd}]
  ├─gssproxy -D
  │   └─5*[{gssproxy}]
  ├─irqbalance --foreground
  │   └─{irqbalance}
  ├─lsmd -d
  ├─lvmetad -f
  ├─master -w
  │   ├─pickup -l -t unix -u
  │   └─qmgr -l -t unix -u
  ├─rngd -f --fill-watermark=0 --exclude=jitter
  ├─rpcbind -w
  ├─rsyslogd -n
  │   └─3*[{rsyslogd}]
  ├─sshd -D
  ├─su -c /usr/bin/java  -Xms128m -Xmx384m -DCORAL_CONFIG_PATH=config/coral-config -jar FmrsAgent.jar -m -s /bin/bash sgserver
  │   └─java -Xms128m -Xmx384m -DCORAL_CONFIG_PATH=config/coral-config -jar FmrsAgent.jar
  │       └─44*[{java}]
  ├─systemd-journal
  ├─systemd-logind
  └─systemd-udevd

sgserverというユーザーで動作しているjavaでDataSyncのエンドポイントと通信していそうですね。

ストレージシステムの追加

次にストレージシステムの追加をします。

DataSyncのコンソールからストレージの検出-ストレージシステムを追加をクリックします。

ストレージシステムの追加

接続先のファイルサーバーの設定をします。

作成したFSx for ONTAPの管理エンドポイントや、FSx for ONTAPの管理者fsxadminの認証情報を保存しているシークレット、DataSyncエージェントなどを指定します。

なお、ストレージタイプは現在Netapp ONTAP 9.6以降固定のようです。

FSx for ONTAPの指定

ストレージシステムの追加をクリックすると、Do not have sufficient permission for CloudWatchとエラーになってしまいました。

Do not have sufficient permission for CloudWatch

CloudTrailを確認すると以下のようなイベントが記録されていました。

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA6KUFAVPUZTMI6DMFH:<IAMユーザー名>",
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<IAMユーザー名>",
        "accountId": "<AWSアカウントID>",
        "accessKeyId": "ASIA6KUFAVPUYVXBNWFC",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA6KUFAVPUZTMI6DMFH",
                "arn": "arn:aws:iam::<AWSアカウントID>:role/<IAMロール名>",
                "accountId": "<AWSアカウントID>",
                "userName": "<IAMユーザー名>"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2022-10-04T04:02:50Z",
                "mfaAuthenticated": "true"
            }
        }
    },
    "eventTime": "2022-10-04T04:41:08Z",
    "eventSource": "datasync.amazonaws.com",
    "eventName": "AddStorageSystem",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "60.71.6.152",
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
    "errorCode": "InvalidRequestException",
    "errorMessage": "Do not have sufficient permission for CloudWatch",
    "requestParameters": {
        "serverConfiguration": {
            "serverHostname": "management.fs-0526a576fb90451ac.fsx.us-east-1.amazonaws.com",
            "serverPort": 443
        },
        "secretsManagerArn": "arn:aws:secretsmanager:us-east-1:<AWSアカウントID>:secret:/fsx-for-ontap/file-system/fsxadmin-ttwP5d",
        "systemType": "NetAppONTAP",
        "agentArns": [
            "arn:aws:datasync:us-east-1:<AWSアカウントID>:agent/agent-015cc87bed2d71eca"
        ],
        "cloudWatchLogGroupArn": "arn:aws:logs:us-east-1:<AWSアカウントID>:log-group:/aws/datasync/discovery",
        "tags": [],
        "name": "FSx for ONTAP",
        "clientToken": "a3d71fd7-a6c6-406c-a25e-a1b04c1aa97d"
    },
    "responseElements": null,
    "requestID": "838624ee-7b15-48bd-bdcb-5b06beea53ef",
    "eventID": "e98901b4-e150-49ef-b6bd-35bc748af51b",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management",
    "tlsDetails": {
        "clientProvidedHostHeader": "discovery-datasync.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}

CloudWatch Logsのリソースポリシーが足りないのかと思い、DataSyncからCloudWatch Logsに対して全ての操作ができるようにしましたが、状況は変わりませんでした。

$ cat << EOF > ./DataSyncLogsToCloudWatchLogsPolicy.json
{
    "Statement": [
        {
            "Sid": "DataSyncLogsToCloudWatchLogs",
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Principal": {
                "Service": "datasync.amazonaws.com"
            },
            "Resource": "*"
        }
    ],
    "Version": "2012-10-17"
}
EOF

$ aws logs put-resource-policy \
  --policy-name DataSyncLogsToCloudWatchLogs \
  --policy-document file://DataSyncLogsToCloudWatchLogsPolicy.json
{
    "resourcePolicy": {
        "policyName": "DataSyncLogsToCloudWatchLogs",
        "policyDocument": "{\n    \"Statement\": [\n        {\n            \"Sid\": \"DataSyncLogsToCloudWatchLogs\",\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"logs:*\"\n            ],\n            \"Principal\": {\n                \"Service\": \"datasync.amazonaws.com\"\n            },\n            \"Resource\": \"*\"\n        }\n    ],\n    \"Version\": \"2012-10-17\"\n}\n",
        "lastUpdatedTime": 1664860614046
    }
}

マネジメントコンソールを操作している権限もAdministratorAccessであり、具体的に何から何への権限が足りないのか判断つきませんでした。パブリックプレビューであまり深く考えてもしょうがないので、最終的にはCloudWatch Logsの設定はしないままストレージシステムの追加を行います。

ストレージシステムが追加されたことを確認します。

ストレージシステムが追加されたことを確認

5分ほど待つと、Connected to storage system FSx for ONTAPとメッセージが表示されました。どうやらDataSyncエージェントからFSx for ONTAPにONTAP APIで接続できたようですね。

Connected to storage system FSx for ONTAP

このタイミングでやはりCloudWatch Logsの設定ができないのが気になったので、AWS CLIから設定できないか試してみます。

AWS公式ドキュメントに従い、DataSync Dicoveryの操作をAWS CLIで行えるように設定します。

# DataSync Discovery のサービスモデルをダウンロード
$ curl https://docs.aws.amazon.com/datasync/latest/userguide/samples/api-2.zip --output api-2.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  8386  100  8386    0     0   499k      0 --:--:-- --:--:-- --:--:--  511k

# zipを解答
$ unzip api-2.zip 
Archive:  api-2.zip
  inflating: api-2.json              

#  DataSync Discovery のサービスモデルをAWS CLIに追加
$ aws configure add-model --service-model file://api-2.json --service-name datasync-discovery

# aws datasync-discovery のサブコマンドを確認
$ aws datasync-discovery help
DATASYNC-DISCOVERY()                                      DATASYNC-DISCOVERY()



NAME
       datasync-discovery -

DESCRIPTION
AVAILABLE COMMANDS
       o add-storage-system

       o cancel-task-execution

       o create-agent

       o create-location-efs

       o create-location-fsx-lustre

       o create-location-fsx-ontap

       o create-location-fsx-open-zfs

       o create-location-fsx-windows

       o create-location-hdfs

       o create-location-nfs

       o create-location-object-storage

       o create-location-s3

       o create-location-smb

       o create-task

       o delete-agent

       o delete-location

       o delete-task

       o describe-agent

       o describe-discovery-job

       o describe-location-efs

       o describe-location-fsx-lustre

       o describe-location-fsx-ontap

       o describe-location-fsx-open-zfs

       o describe-location-fsx-windows

       o describe-location-hdfs

       o describe-location-nfs

       o describe-location-object-storage

       o describe-location-s3

       o describe-location-smb

       o describe-storage-system

       o describe-storage-system-resource-metrics

       o describe-storage-system-resources

       o describe-task

       o describe-task-execution

       o generate-recommendations

       o help

       o list-agents

       o list-discovery-jobs

       o list-locations

       o list-storage-systems

       o list-tags-for-resource

       o list-task-executions

       o list-tasks

       o remove-storage-system

       o start-discovery-job

       o start-task-execution

       o stop-discovery-job

       o tag-resource

       o untag-resource

       o update-agent

       o update-discovery-job

       o update-location-hdfs

       o update-location-nfs

       o update-location-object-storage

       o update-location-smb

       o update-storage-system

       o update-task

       o update-task-execution



                                                          DATASYNC-DISCOVERY()

ストレージシステムにCloudWatch Logsの設定を行います。

# ストレージシステムのARNの確認
$ aws datasync-discovery list-storage-systems
{
    "StorageSystems": [
        {
            "StorageSystemArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:system/storage-system-b9f09c4a-2b50-486d-8464-a89ff6641d04"
        }
    ]
}

# ストレージシステムにCloudWatch Logsを設定
$ update_storage_system=$(cat <<EOM
{
    "StorageSystemArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:system/storage-system-b9f09c4a-2b50-486d-8464-a89ff6641d04",
    "CloudWatchLogGroupArn": "arn:aws:logs:us-east-1:<AWSアカウントID>:log-group:/aws/datasync/discovery"
}
EOM
)

aws datasync-discovery update-storage-system \
  --cli-input-json "$update_storage_system"

An error occurred (InvalidRequestException) when calling the UpdateStorageSystem operation: Do not have sufficient permission for CloudWatch

同じエラーで怒られましたね。AWS CLIでもできませんでした。残念。

検出ジョブの開始

気を取り直して検出ジョブの開始を行います。

アクション-開始をクリックします。

ジョブの実行期間を選択します。精度を上げるためには14日以上設定する必要があるようです。今回は1日に変更して、Start discovery jobをクリックします。

Start discovery job

検出ジョブが実行されたようです。

「検出ジョブが開始されました。初期情報 (ボリューム、容量、クライアント) は 1 時間以内に利用可能になります。パフォーマンスデータは 24 時間ごとに追加および更新されます。」と表示されているので、少し待ちましょう。

検出ジョブが開始されました

なお、検出ジョブが既に実行中である場合、新たに実行することはできないようです。

同時に複数のジョブは実行できない

しばらくすると、接続先のFSx for ONTAPのボリュームが検出されました。

ジョブ実行確認

ボリュームをクリックすると、容量、IOPS、スループット、レイテンシーのグラフが表示されました。

ボリュームの確認

パフォーマンスデータの確認

FSx for ONTAPに書き込みや読み込みをすると、どのように検出されるのか試してみます。

まずは90GBほど書き込みしてみます。

$ sudo dd if=/dev/urandom of=/mnt/fsx/testfile_1 bs=1M count=51200
51200+0 records in
51200+0 records out
53687091200 bytes (54 GB) copied, 413.112 s, 130 MB/s

$ sudo dd if=/dev/urandom of=/mnt/fsx/testfile_2 bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 332.292 s, 129 MB/s

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0307378877fb626ad.fs-0526a576fb90451ac.fsx.us-east-1.amazonaws.com:/volume   95G   92G  3.7G  97% /mnt/fsx

そして、以下コマンドで書き込みしたファイルを読み込んでみます。

$ dd if=/mnt/fsx/testfile_1 of=/dev/null
104857600+0 records in
104857600+0 records out
53687091200 bytes (54 GB) copied, 172.493 s, 311 MB/s

1回だけだと面白くないので、何回も繰り返して読み込ませます。

$ while true; do 
  dd if=/mnt/fsx/testfile_1 of=/dev/null
done

3時間後のパフォーマンスデータは以下の通りです。各項目がグラフとして表示されていますね。

3時間後のパフォーマンスデータ

グラフにカーソルを合わせるとツールチップで詳細を確認することができます。

ツールチップで表示

グラフのポイントを確認すると「10月4日 14:54」、「10月4日 15:54」、「10月4日 16:54」と1時間単位で出力されていました。

収集された情報はAWS CLIからも確認できます。

# 検出ジョブの一覧
$ aws datasync-discovery list-discovery-jobs
{
    "DiscoveryJobs": [
        {
            "DiscoveryJobArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:system/storage-system-b9f09c4a-2b50-486d-8464-a89ff6641d04/job/discovery-job-328a6b49-4255-4c78-b00f-641a587a19ab",
            "Status": "RUNNING"
        }
    ]
}

# 認識しているSVMの一覧
$ aws datasync-discovery describe-storage-system-resources \
  --discovery-job-arn "arn:aws:datasync:us-east-1:<AWSアカウントID>:system/storage-system-b9f09c4a-2b50-486d-8464-a89ff6641d04/job/discovery-job-328a6b49-4255-4c78-b00f-641a587a19ab" \
  --resource-type SVM
{
    "ResourceDetails": {
        "NetAppONTAPSVMs": [
            {
                "SvmUuid": "cb09664f-439d-11ed-a63d-e97056ce2423",
                "SvmName": "fsx-for-ontap-svm"
            }
        ]
    }
}

# 認識しているボリュームの一覧
$ aws datasync-discovery describe-storage-system-resources \
  --discovery-job-arn "arn:aws:datasync:us-east-1:<AWSアカウントID>:system/storage-system-b9f09c4a-2b50-486d-8464-a89ff6641d04/job/discovery-job-328a6b49-4255-4c78-b00f-641a587a19ab" \
  --resource-type VOLUME
{
    "ResourceDetails": {
        "NetAppONTAPVolumes": [
            {
                "VolumeName": "fsx_for_ontap_volume",
                "VolumeUuid": "398e7525-439e-11ed-a63d-e97056ce2423",
                "EnabledProtocols": [
                    "NFS"
                ],
                "CifsClientCount": 0,
                "NfsClientCount": 1,
                "SvmUuid": "cb09664f-439d-11ed-a63d-e97056ce2423",
                "SvmName": "fsx-for-ontap-svm",
                "CapacityUsed": 55299604480,
                "CapacityProvisioned": 107374182400,
                "LogicalCapacityUsed": 55299604480,
                "MaxP95Performance": {
                    "IopsRead": 4864.0,
                    "IopsWrite": 1983.0,
                    "IopsOther": 0.0,
                    "IopsTotal": 4864.0,
                    "ThroughputRead": 318767104.0,
                    "ThroughputWrite": 129992976.55,
                    "ThroughputOther": 0.0,
                    "ThroughputTotal": 318767104.0,
                    "LatencyRead": 1787.0500000000002,
                    "LatencyWrite": 29989.4,
                    "LatencyOther": 87.19999999999993
                },
                "Recommendations": []
            },
            {
                "VolumeName": "fsx_for_ontap_svm_root",
                "VolumeUuid": "d042d44e-439d-11ed-a63d-e97056ce2423",
                "EnabledProtocols": [
                    "NFS"
                ],
                "CifsClientCount": 0,
                "NfsClientCount": 1,
                "SvmUuid": "cb09664f-439d-11ed-a63d-e97056ce2423",
                "SvmName": "fsx-for-ontap-svm",
                "CapacityUsed": 507904,
                "CapacityProvisioned": 1073741824,
                "LogicalCapacityUsed": 507904,
                "MaxP95Performance": {
                    "IopsRead": 0.0,
                    "IopsWrite": 0.0,
                    "IopsOther": 0.0,
                    "IopsTotal": 0.0,
                    "ThroughputRead": 0.0,
                    "ThroughputWrite": 0.0,
                    "ThroughputOther": 0.0,
                    "ThroughputTotal": 0.0,
                    "LatencyRead": 0.0,
                    "LatencyWrite": 0.0,
                    "LatencyOther": 0.0
                },
                "Recommendations": []
            }
        ]
    }
}

時間毎のメトリクスについてもAWS CLIで確認できます。

# 読み書きの負荷テストをしたボリュームのメトリクス
$ aws datasync-discovery describe-storage-system-resource-metrics \
  --discovery-job-arn "arn:aws:datasync:us-east-1:<AWSアカウントID>:system/storage-system-b9f09c4a-2b50-486d-8464-a89ff6641d04/job/discovery-job-328a6b49-4255-4c78-b00f-641a587a19ab" \
  --resource-id 398e7525-439e-11ed-a63d-e97056ce2423 \
  --resource-type VOLUME
{
    "ResourceType": "VOLUME",
    "ResourceId": "398e7525-439e-11ed-a63d-e97056ce2423",
    "Metrics": [
        {
            "Timestamp": "2022-10-04T05:54:12.612000+00:00",
            "P95Metrics": {
                "IOPS": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Throughput": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Latency": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0
                }
            },
            "Capacity": {
                "Used": 348160,
                "Provisioned": 107374182400
            }
        },
        {
            "Timestamp": "2022-10-04T06:54:14.239000+00:00",
            "P95Metrics": {
                "IOPS": {
                    "Read": 4864.0,
                    "Write": 1983.0,
                    "Other": 0.0,
                    "Total": 4864.0
                },
                "Throughput": {
                    "Read": 318767104.0,
                    "Write": 129992976.55,
                    "Other": 0.0,
                    "Total": 318767104.0
                },
                "Latency": {
                    "Read": 1787.0500000000002,
                    "Write": 29989.4,
                    "Other": 66.39999999999986
                }
            },
            "Capacity": {
                "Used": 98072748032,
                "Provisioned": 107374182400
            }
        },
        {
            "Timestamp": "2022-10-04T07:54:16.186000+00:00",
            "P95Metrics": {
                "IOPS": {
                    "Read": 4729.249999999999,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 4729.249999999999
                },
                "Throughput": {
                    "Read": 309979599.54999995,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 309979599.54999995
                },
                "Latency": {
                    "Read": 1685.2999999999997,
                    "Write": 0.0,
                    "Other": 87.19999999999993
                }
            },
            "Capacity": {
                "Used": 55298494464,
                "Provisioned": 107374182400
            }
        },
        {
            "Timestamp": "2022-10-04T08:54:18.083000+00:00",
            "P95Metrics": {
                "IOPS": {
                    "Read": 121.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 121.0
                },
                "Throughput": {
                    "Read": 7947332.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 7947332.0
                },
                "Latency": {
                    "Read": 148.04999999999998,
                    "Write": 0.0,
                    "Other": 54.099999999999966
                }
            },
            "Capacity": {
                "Used": 55299604480,
                "Provisioned": 107374182400
            }
        }
    ]
}

# SVMのルートボリュームのメトリクス
$ aws datasync-discovery describe-storage-system-resource-metrics \
  --discovery-job-arn "arn:aws:datasync:us-east-1:<AWSアカウントID>:system/storage-system-b9f09c4a-2b50-486d-8464-a89ff6641d04/job/discovery-job-328a6b49-4255-4c78-b00f-641a587a19ab" \
  --resource-id d042d44e-439d-11ed-a63d-e97056ce2423 \
  --resource-type VOLUME
{
    "ResourceType": "VOLUME",
    "ResourceId": "d042d44e-439d-11ed-a63d-e97056ce2423",
    "Metrics": [
        {
            "Timestamp": "2022-10-04T05:54:12.612000+00:00",
            "P95Metrics": {
                "IOPS": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Throughput": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Latency": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0
                }
            },
            "Capacity": {
                "Used": 372736,
                "Provisioned": 1073741824
            }
        },
        {
            "Timestamp": "2022-10-04T06:54:14.239000+00:00",
            "P95Metrics": {
                "IOPS": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Throughput": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Latency": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0
                }
            },
            "Capacity": {
                "Used": 417792,
                "Provisioned": 1073741824
            }
        },
        {
            "Timestamp": "2022-10-04T07:54:16.186000+00:00",
            "P95Metrics": {
                "IOPS": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Throughput": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Latency": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0
                }
            },
            "Capacity": {
                "Used": 462848,
                "Provisioned": 1073741824
            }
        },
        {
            "Timestamp": "2022-10-04T08:54:18.083000+00:00",
            "P95Metrics": {
                "IOPS": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Throughput": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0,
                    "Total": 0.0
                },
                "Latency": {
                    "Read": 0.0,
                    "Write": 0.0,
                    "Other": 0.0
                }
            },
            "Capacity": {
                "Used": 507904,
                "Provisioned": 1073741824
            }
        }
    ]
}

レコメンデーションの確認

最後にレコメンデーションの確認をします。

レコメンデーションを生成するには検出ジョブが停止している必要があるため、検出ジョブを停止させます。

検出ジョブを停止

検出ジョブが停止するとジョブのステータスが停止済みに変わります。そして、Get recommendationsボタンが表示されるようになります。

検出ジョブが正常に停止しました

Get recommendationsをクリックします。14日間ジョブを動かしていないので警告されますが、Generate Recommendationsをクリックします。

Generate Recommendations

しばらくすると、Recommendationsが完了に変わりました。レコメンデーションと見積りタブを開くと、そのボリュームの推奨サービスと設定値、その設定をした場合の月額料金が表示されました。

レコメンデーションの確認

より高性能なスループットを求めるのであれば、EFSよりもFSx for ONTAPを採用した方がコストがお安いというのが一目で分かりますね。

一方、ルートボリュームには一切アクセスしていないので、EFSの方が月額料金が安くなります。

ルートボリュームのレコメンデーションの確認

AWS CLIからも確認してみましょう。

$ aws datasync-discovery describe-storage-system-resources \
  --discovery-job-arn "arn:aws:datasync:us-east-1:<AWSアカウントID>:system/storage-system-b9f09c4a-2b50-486d-8464-a89ff6641d04/job/discovery-job-328a6b49-4255-4c78-b00f-641a587a19ab" \
  --resource-type VOLUME
{
    "ResourceDetails": {
        "NetAppONTAPVolumes": [
            {
                "VolumeName": "fsx_for_ontap_volume",
                "VolumeUuid": "398e7525-439e-11ed-a63d-e97056ce2423",
                "EnabledProtocols": [
                    "NFS"
                ],
                "CifsClientCount": 0,
                "NfsClientCount": 1,
                "SvmUuid": "cb09664f-439d-11ed-a63d-e97056ce2423",
                "SvmName": "fsx-for-ontap-svm",
                "CapacityUsed": 55299604480,
                "CapacityProvisioned": 107374182400,
                "LogicalCapacityUsed": 55299604480,
                "MaxP95Performance": {
                    "IopsRead": 4864.0,
                    "IopsWrite": 1983.0,
                    "IopsOther": 0.0,
                    "IopsTotal": 4864.0,
                    "ThroughputRead": 318767104.0,
                    "ThroughputWrite": 129992976.55,
                    "ThroughputOther": 0.0,
                    "ThroughputTotal": 318767104.0,
                    "LatencyRead": 1787.0500000000002,
                    "LatencyWrite": 29989.4,
                    "LatencyOther": 87.19999999999993
                },
                "Recommendations": [
                    {
                        "StorageType": "fsxOntap",
                        "StorageConfiguration": {
                            "CapacityPoolGB": "0",
                            "DeploymentType": "Multi-AZ",
                            "ProvisionedIOpsMode": "USER_PROVISIONED",
                            "StorageCapacityGB": "1024",
                            "StorageEfficiency": "0.0%",
                            "ThroughputCapacity": "512",
                            "TotalIOps": "4864"
                        },
                        "EstimatedMonthlyStorageCost": "1036.0"
                    },
                    {
                        "StorageType": "efs",
                        "StorageConfiguration": {
                            "InfrequentAccessRequests": "4",
                            "InfrequentAccessStorageGB": "42",
                            "PerformanceMode": "General Purpose",
                            "ProvisionedThroughputMBps": "304",
                            "StandardStorageGB": "11",
                            "ThroughputMode": "Provisioned"
                        },
                        "EstimatedMonthlyStorageCost": "1826.0"
                    }
                ]
            },
            {
                "VolumeName": "fsx_for_ontap_svm_root",
                "VolumeUuid": "d042d44e-439d-11ed-a63d-e97056ce2423",
                "EnabledProtocols": [
                    "NFS"
                ],
                "CifsClientCount": 0,
                "NfsClientCount": 1,
                "SvmUuid": "cb09664f-439d-11ed-a63d-e97056ce2423",
                "SvmName": "fsx-for-ontap-svm",
                "CapacityUsed": 507904,
                "CapacityProvisioned": 1073741824,
                "LogicalCapacityUsed": 507904,
                "MaxP95Performance": {
                    "IopsRead": 0.0,
                    "IopsWrite": 0.0,
                    "IopsOther": 0.0,
                    "IopsTotal": 0.0,
                    "ThroughputRead": 0.0,
                    "ThroughputWrite": 0.0,
                    "ThroughputOther": 0.0,
                    "ThroughputTotal": 0.0,
                    "LatencyRead": 0.0,
                    "LatencyWrite": 0.0,
                    "LatencyOther": 0.0
                },
                "Recommendations": [
                    {
                        "StorageType": "fsxOntap",
                        "StorageConfiguration": {
                            "CapacityPoolGB": "0",
                            "DeploymentType": "Multi-AZ",
                            "ProvisionedIOpsMode": "AUTOMATIC",
                            "StorageCapacityGB": "1024",
                            "StorageEfficiency": "0.0%",
                            "ThroughputCapacity": "128",
                            "TotalIOps": "0"
                        },
                        "EstimatedMonthlyStorageCost": "410.0"
                    },
                    {
                        "StorageType": "efs",
                        "StorageConfiguration": {
                            "InfrequentAccessRequests": "0",
                            "InfrequentAccessStorageGB": "1",
                            "PerformanceMode": "General Purpose",
                            "ProvisionedThroughputMBps": "0",
                            "StandardStorageGB": "1",
                            "ThroughputMode": "Bursting"
                        },
                        "EstimatedMonthlyStorageCost": "1.0"
                    }
                ]
            }
        ]
    }
}

各ボリュームの推奨事項が表示されていますね。

早くGAしてほしい

AWS DataSync Discovery を紹介しました。

DataSync Discoveryを使用することで、移行対象のファイルサーバーの特徴を掴むことが簡単になりそうです。

これは早くGAしてほしいですね。

個人的にはディレクトリ構成やディレクトリとファイルの数、ファイルのサイズの傾向、1ファイルの最大サイズなんかも取得できると嬉しいです。GAになるのを期待して待ちます。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!