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

所要時間3分
0

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) ユーザー/ロール: 以下の IAM ユーザーまたはロールに必要なアクセス許可があることを確認します。

  • クロスアカウント S3 ロケーションの作成に使用しているユーザーまたはロール
  • S3 ロケーションに割り当てたロール

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 はこのロールを使用してクロスアカウントデータにアクセスします。

送信先 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:123456789012:location/loc-0f8xxxxxxxxe4821"
}

123456789012 をソースアカウントのアカウント ID で置き換える

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 をソースバケットの名前で置き換える
  • example-DataSync-Region を DataSync タスクを作成するリージョンで置き換える

DataSync タスクを作成する

DataSync タスクを設定し、DataSync コンソールからタスクを開始します。詳細については、「Starting your AWS DataSync task」(AWS 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 タスクを設定するのがベストプラクティスです。


関連情報

AWS DataSync を使用して Amazon S3 バケット間でデータを移行する方法

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ