AWS DataSync を使用して、クロスアカウントの Simple Storage Service (Amazon S3) ロケーションとの間でデータを転送する方法を教えてください。

最終更新日: 2022 年 4 月 26 日

AWS DataSync を使用して、クロスアカウントの Amazon Simple Storage Service (Amazon S3) バケットとの間でデータを転送したいと考えています。

簡単な説明

クロスアカウントのデータ転送に DataSync を使用する場合は、次の操作を行います。

  1. AWS Command Line Interface (AWS CLI) または AWS SDK を使用して、DataSync でクロスアカウント Amazon S3 ロケーションを作成します。
  2. ソースバケットから送信先バケットにデータを転送する DataSync タスクを作成します。

DataSync を使用して異なる S3 アカウントが所有するバケット間でデータを転送する場合は、次の制限事項に注意してください。

  • DataSync は、クロスアカウントの送信先バケットにデータを転送するときに bucket-owner-full-control アクセスコントロールリスト (ACL) を適用しないため、送信先バケットでオブジェクトの所有権に関する問題が発生します。
  • クロスアカウント S3 ロケーションでは、同じリージョンのクロスアカウントバケットのみがサポートされます。クロスアカウントおよびクロスリージョンの S3 ロケーションを使用すると、「GetBucketLocation」 または 「Unable to connect to S3 endpoint」(S3 エンドポイントに接続できません) というエラーが表示されます。
  • クロスアカウントパスロールを使用して、クロスアカウント S3 ロケーションにアクセスすることはできません。

上記の制限事項を回避することで、送信先アカウントの DataSync タスクがソースからデータをプルするように設定できます。

解決方法

必要なチェックを実行する

ソースアカウントにクロスアカウントのソース S3 バケットがあり、送信先アカウントには送信先 S3 バケットと DataSync タスクがあるとします。次のチェックを実行します。

AWS Identity and Management (IAM) ユーザー/ロール: クロスアカウント S3 ロケーションの作成に使用している IAM ユーザー/ロールと、S3 ロケーションに割り当てた IAM ロールに、必要なアクセス許可が付与されているかどうかをチェックします。

Source bucket policy: ソースバケットポリシーで、送信先アカウントの IAM ユーザー/ロールの両方がバケットにアクセスできることを確認します。次のポリシー例では、IAM ユーザー/ロールの両方に対してソースバケットへのアクセスが許可されています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::1111222233334444:role/datasync-config-role",
          "arn:aws:iam::1111222233334444:role/datasync-transfer-role"
        ]
      },
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": [
        "arn:aws:s3:::example-source-bucket"
      ]
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::1111222233334444:role/datasync-config-role",
          "arn:aws:iam::1111222233334444:role/datasync-transfer-role"
        ]
      },
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:ListMultipartUploadParts",
        "s3:PutObjectTagging",
        "s3:GetObjectTagging",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::example-source-bucket/*"
      ]
    }
  ]
}

前述のポリシーに含まれる各値に対して次の操作を必ず行ってください。

  • example-source-bucket をソースバケットの名前で置き換える
  • 1111222233334444 を送信先アカウントのアカウント ID で置き換える
  • datasync-config-role を DataSync 設定 (例: DataSync でソース S3 ロケーションとタスクの作成) で使用される IAM ロールで置き換える
    注: IAM ユーザーを使用することもできます。この記事では、IAM ロールの使用が考慮されています。
  • datasync-transfer-role をソース S3 ロケーションの作成時に割り当てられた IAM ロールで置き換える
    注: DataSync はこのロールを使用してクロスアカウントデータにアクセスします。

Destination S3 location: 送信先 S3 ロケーションが Amazon S3 のロケーションの作成の手順に従って作成されていることを確認します。

AWS CLI または SDK を使用して DataSync でクロスアカウントのソース S3 ロケーションを作成する

注: AWS マネジメントコンソールでは、クロスアカウント S3 ロケーションの作成がサポートされていません。

クロスアカウント S3 ロケーションは、次のいずれかの方法で作成できます。

  • 設定 JSON ファイルを使用します。
  • AWS CLI コマンドのオプションを使用します。

設定 JSON ファイルを使用する

1.    次のパラメータを使用して、クロスアカウント S3 ロケーション用の設定 JSON ファイル input.template を作成します。

{
  "Subdirectory": "",
  "S3BucketArn": "arn:aws:s3:::[Source bucket]",
  "S3StorageClass": "STANDARD",
  "S3Config": {
    "BucketAccessRoleArn": "arn:aws:iam::1111222233334444:role/datasync-transfer-role"
  }
}

2.    次の AWS CLI コマンドを実行して S3 ロケーションを作成します。

aws datasync create-location-s3 --cli-input-json file://input.template --region example-DataSync-Region

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

詳細については、create-location-s3 を参照してください。

S3 ロケーションが作成されると、次の出力が表示されます。

{
"LocationArn": "arn:aws:datasync:example-Region:1111222233334444:location/loc-0f8xxxxxxxxe4821"
}

AWS CLI コマンドのオプションを使用する

次の AWS CLI コマンドを適切なオプションを指定して実行します。

aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::example-source-bucket --s3-storage-class STANDARD --s3-config BucketAccessRoleArn="arn:aws:iam::1111222233334444:role/datasync-transfer-role" --region example-DataSync-Region

コマンドに含まれる各値に対して次の操作を必ず行ってください。

  • example-source-bucket をソースバケットの名前で置き換える
  • 1111222233334444 をソースアカウントのアカウント ID で置き換える
  • example-DataSync-Region を DataSync タスクを作成するリージョンで置き換える。

DataSync タスクを作成する

DataSync タスクを設定し、DataSync コンソールからタスクを開始します。詳細については、タスクの作成を参照してください。

既知のエラーと解決方法

Error: error creating DataSync Location S3: InvalidRequestException: Please provide a bucket in the xxx region where DataSync is currently used (エラー: DataSync ロケーションの作成中にエラーが発生しました S3: InvalidRequestException: DataSync が現在使用されている xxx リージョンでバケットを指定してください)

このエラーが表示された場合は、バケットと IAM ポリシーに次の必要なアクセス許可が含まれているかどうかを確認してください。

"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
]

クロスアカウントバケットの使用時にこのエラーが発生する場合は、バケットが DataSync タスクと同じリージョンに存在することを確認してください

S3 オブジェクトの所有権に関する問題

DataSync では、クロスアカウントバケットの送信先ロケーションとしての使用がサポートされていません。したがって、ACL bucket-owner-full-control を使用できません。DataSync タスクがソースバケットアカウントから実行された場合、送信先バケットアカウントにアップロードされたオブジェクトに、オブジェクトの所有権に関する問題が発生することがあります。この問題を解決するには、送信先バケットに ACL を使用するオブジェクトがない場合は、送信先バケットの ACL を無効にすることを検討してください。詳細については、オブジェクトの所有権の制御とバケットの ACL の無効化を参照してください。それ以外の場合、ソースからデータをプルするように、送信先アカウントで DataSync タスクを設定するのがベストプラクティスです。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?