AWS DataSync のロケーションをロケーションタイプ S3 と EFS と NFS で作成してみた

データ転送タスクを行う前の前段作業として、まずはロケーションを作成してみました。

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

コンバンハ、千葉(幸)です。

AWS DataSync は各種ストレージサービス間でのデータ転送をシンプルかつ高速に実現してくれるサービスです。

S3 や EFS などの AWS 上のサービスや、オンプレで稼働している NFS 、SMB ストレージ などをロケーションとして定義し、それらを送信先/送信先として組み合わせることで、データ転送が実現できます。

ロケーションタイプとしては以下があります。

  • Network File System (NFS)
  • Server Message Block (SMB)
  • 自己管理オブジェクトストレージ
  • Amazon EFS
  • Amazon FSx for Windows File Server
  • Amazon S3

今回は、上記で太字にした 3 つのロケーションタイプでロケーションを作成してみます。

なぜ EFS に対して「タイプ:NFS」のロケーションを作成しているの……と気になった方がいるかもしれませんが、理由については後述します。

目次

S3 ロケーションの作成

参考にするドキュメントはこちらです。

今回はすでに、ロケーションの対象となる(タスクのエンドポイントとなる、という表現がされます)S3 バケットchiba-datasync-locationが作成済みであるとします。

マネジメントコンソールより、DataSync -> Locations 画面に遷移し、[ Create Location ] を押下します。

以下のパラメータを入力し、[ Create Location ] を押下します。

  • ロケーションタイプ:Amazon S3 bucket
  • S3 バケット:対象としたいバケット
  • S3 ストレージクラス:転送されたオブジェクトに設定したいストレージクラス
  • フォルダー:データの読み取り、あるいは書き込みの対象となるプレフィックス
  • IAM ロール:S3 へのアクセスに用いる IAM ロール

IAM ロールは、ロケーション作成時に自動作成することもできます。内容はこの後に少し補足します。

作成したロケーションはこのように確認できます。

せっかくなので AWS CLI での確認も行います。

aws datasync describe-location-s3 --location-arn arn:aws:datasync:ap-northeast-1:000000000000:location/loc-0ee59fexxx3fff39a
{
    "LocationArn": "arn:aws:datasync:ap-northeast-1:000000000000:location/loc-0ee59fexxx3fff39a",
    "LocationUri": "s3://chiba-datasync-location/hoge/",
    "S3StorageClass": "STANDARD",
    "S3Config": {
        "BucketAccessRoleArn": "arn:aws:iam::000000000000:role/service-role/AWSDataSyncS3BucketAccess-chiba-datasync-location"
    },
    "CreationTime": "2020-08-29T23:27:39.955000+09:00"
}

ちなみに、S3 ロケーションに限った話ではないですが、同一のコンポーネントを参照するロケーションを複数作成することができます。コンポーネントは同じだがパスが異なる、といった場合はロケーションを作り分けることになります。

S3 ロケーション用 IAM ロールの内訳

ロケーション作成時に自動生成した IAM ロールの内訳を確認しておきましょう。

  • パス:/service-role/
  • ロール名:AWSDataSyncS3BucketAccess-<S3 バケット名>
  • 信頼されたエンティティ:ID プロバイダー datasync.amazonaws.com
  • アタッチされたポリシー:ロール名と同一のカスタマー管理ポリシー

データ転送の際の読み書きはこの IAM ロールの権限によって行われます。

アタッチされたポリシーの内訳は以下です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:HeadBucket"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<S3 バケット名>"
        },
        {
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<S3 バケット名>/*"
        }
    ]
}

(ちなみにこのロールがサービスにリンクされたロールかどうか判断が付きますか?サービスにリンクされたロールの場合、パスが/aws-service-role/サービス名.amazonaws.com/になります。)

EFS ロケーションの作成

参考にするドキュメントはこちらです。

今回はすでに、ロケーションの対象となる EFS ファイルシステムが作成済みのものとします。

先ほどと同じように、DataSync -> Locations 画面 -> [ Create Location ] より作成画面に遷移します。

以下のパラメータを入力し、[ Create Location ] を押下します。

  • ロケーションタイプ:Amazon EFS file system
  • EFS ファイルシステム:対象としたい EFS ファイルシステム
  • マウントパス:マウントパス。省略した場合ルートディレクトリを使用
  • サブネット:マウントターゲットが存在するサブネットのいずれか
  • セキュリティグループ:DataSync がファイルシステムへの接続に使用するセキュリティグループ

タスク実行時には、ここで指定するセキュリティグループとマウントターゲットにアタッチされているセキュリティグループ間で通信が可能である必要があります。

ロケーションが作成できました。

AWS CLI での確認結果です。S3 ロケーションとは内訳が異なりますね。

aws datasync describe-location-efs --location-arn arn:aws:datasync:ap-northeast-1:000000000000:location/loc-0039b5752xxxcee2b
{
    "LocationArn": "arn:aws:datasync:ap-northeast-1:000000000000:location/loc-0039b5752xxxcee2b",
    "LocationUri": "efs://ap-northeast-1.fs-fbb9a9da/fuga/",
    "Ec2Config": {
        "SubnetArn": "arn:aws:ec2:ap-northeast-1:000000000000:subnet/subnet-09b107b0dxxx26bb8",
        "SecurityGroupArns": [
            "arn:aws:ec2:ap-northeast-1:000000000000:security-group/sg-02d9d038xxxbf387a"
        ]
    },
    "CreationTime": "2020-08-30T23:03:52.750000+09:00"
}

NFS ロケーションの作成

参考にするドキュメントはこちらです。

今回は、先ほどの EFS ロケーションと同一の EFS ファイルシステムを対象として、NFS ロケーションを作成します。

「ロケーションタイプに EFS が用意されているのに、なぜわざわざ NFS ロケーションで作成するの?」という疑問が生じるかもしれません。その理由は、以下の通りです。

  • ロケーションタイプのうちいくつかのみ、エージェントの指定ができる
  • タスクに登録する際、送信元もしくは送信先でエージェントを含むロケーションが指定されている必要がある

AWS DataSync では、送信元と送信先のロケーション、および転送のオプションを指定してタスクという単位で定義を行います。データ転送を中継するコンポーネントとしてエージェントが必要ですが、タスクの中で「このエージェントを使用する」という指定はできません。

ロケーションタイプのうち、以下で太字にしているものはロケーションの設定としてエージェントと紐付けを行うことができます。送信元もしくは送信先のいずれかで「エージェントと紐づいたロケーション」を選択することで、一連のデータ転送処理が実現できます。

  • Network File System (NFS)
  • Server Message Block (SMB)
  • 自己管理オブジェクトストレージ
  • Amazon EFS
  • Amazon FSx for Windows File Server
  • Amazon S3

例えば EFS から S3 にデータ転送を行いたい場合、EFS タイプのロケーションを選択するとエージェントとの紐付けが行えないため、NFS ロケーションとして構成する必要があります。

送信元および送信先としてサポートされている組み合わせは以下の通りです。

改めて NFS ロケーションの作成

今回は以下の手順に従い、パブリックサービスエンドポイントでアクティベートしたエージェントが準備済みであるとします。

DataSync -> Locations 画面 -> [ Create Location ] より作成画面に遷移します。

以下のパラメータを入力し、[ Create Location ] を押下します。

  • ロケーションタイプ:Network File System (NFS)
  • エージェント:紐づける DataSync エージェント
  • NFS サーバ:NFS サーバのドメイン名もしくは IP アドレス。今回はマウントターゲットの IP を指定
  • マウントパス:マウントパス
  • NFS バージョン:デフォルトは自動で識別、明示的に指定も可

作成できました。

ちなみに、この時点では「 EFS ファイルシステムのマウントターゲット」と「エージェント用 EC2 インスタンス」間ではSecuriryGroupを開放していないのですが、特に問題なく作成ができました。ロケーション作成時に「疎通可能な状態であるか」という確認は取られていないということですね。

AWS CLI による確認結果です。OnPremConfigとして、エージェントの情報が確認できます。

aws datasync describe-location-nfs --location-arn arn:aws:datasync:ap-northeast-1:000000000000:location/loc-05bcd26b8xxxa51a0
{
    "LocationArn": "arn:aws:datasync:ap-northeast-1:000000000000:location/loc-05bcd26b8xxxa51a0",
    "LocationUri": "nfs://192.168.1.118/fuga/",
    "OnPremConfig": {
        "AgentArns": [
            "arn:aws:datasync:ap-northeast-1:000000000000:agent/agent-0e7a894xxxbae538c"
        ]
    },
    "MountOptions": {
        "Version": "AUTOMATIC"
    },
    "CreationTime": "2020-08-31T20:26:48.433000+09:00"
}

終わりに

AWS DataSync のロケーションをいくつかのタイプで作成してみました。

タイプごとに設定値が異なることが確認できました。また、ロケーションの作成時点では必要な通信要件はないこと分かりました。通信要件に不備があれば、タスクを実行したタイミングで判明するということですね。

そろそろ次回あたりは、タスクを実行してデータ転送を確認してみたいと思います。

以上、千葉(幸)がお送りしました。