Transfer data Amazon S3 pada Cross Account meggunakan AWS DataSync

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

Perkenalkan saya Iman dari Annotation.

Pada blog kali ini saya telah melakukan percobaan mentransfer data Amazon S3 Cross Account meggunakan AWS DataSync.
Saya melakukan percobaan ini berdasarkan referensi Knowledge Center berikut dengan perubahan dan penambahan setting pada IAM Policy dan Bucket Policy.

How can I use AWS DataSync to transfer the data to or from a cross-account Amazon S3 location?

Hal-hal yang harus diperhatikan

Saat mentransfer data pada Cross Account, tentukan Source Account dan Destination Account terlebihdahulu, serta tetapkan Resource dan Policy yang diperlukan untuk masing-masing Account.
Pertama-tama, saya ingin memperkenalkan hal-hal yang harus diperhatikan yang saya temukan selama percobaan, termasuk hal-hal yang harus diperhatikan yang juga tercantum di Pusat Pengetahuan.

  • Setelah menentukan Source Account dan Destination Account, tentukan akan membuat S3 Location di Source Account dan Destination Account.
    Karena S3 Location pada percobaan kali ini akan dibuat di Destination Account, semua Resource DataSync (Source Location, Destination Location, Task) akan dibuat di Destination Account.

  • S3 Location Cross Account tidak dapat diakses menggunakan Cross-account pass role.
    Sebagai contoh, jika Log-in ke Destination Location dan menentukan Bucket Access Role sebagai Role Source Account, saat membuat S3 Location dengan AWS CLI, akan terjadi Error.

Cross-account pass role is not allowed

Oleh karena itu, saat Log-in ke Destination Location, saat membuat S3 Source Location dengan AWS CLI, pilih Role Destination Account untuk Bucket Access Role, dan pilih S3 Bucket Source Account untuk S3 Bucket.

  • Dalam Bucket Policy S3 Bucket Source, tentukan IAM User/Role yang akan digunakan untuk membuat S3 Location di Destination Account menggunakan Action s3:ListBucket.
    Jika Anda tidak setting pengaturan ini, Error sebagai akan terjadi saat membuat Source S3 Location dengan AWS CLI saat berada ke Destination Account.
An error occurred (InvalidRequestException) when calling the CreateLocationS3 operation: DataSync location access test failed: 
could not perform s3:HeadBucket on bucket XXX. Access denied. Ensure bucket access role has s3:ListBucket permission.
  • Nonaktifkan settings ACL untuk bucket S3.

Resource yang diperlukan

Source Account (A):

  • Source S3 bucket (perlu setting bucket policy)

Destination Account (B):

  • Destination S3 bucket (tidak perlu setting bucket policy)
  • IAM role: datasync-config-role (memilih destination bucket)
  • IAM role: datasync-transfer-role (memilih source bucket)
  • Source location (dibuat dengan AWS CLI)
  • Destination location (dibuat di Management Console)
  • Tasks (dibuat di Management Console)

Percobaan

Langkah-langkah percobaan kali ini sebagai berikut.

  • Buat Source S3 Bucket di Source Account (A) dan Upload file yang akan ditransfer
  • Buat Destination S3 Bucket di Destination Account (B)
  • Buat IAM roles datasync-config-role dan datasync-transfer-role di Destination Account (B)
  • Setting Bucket Policy untuk Source S3 Bucket di Source Account (A)
  • Buat Source S3 Location dengan AWS CLI di Destination Account (B)
  • Buat Destination S3 Location di Destination Account (B)
  • Buat Task di Destination Account (B) dan jalankan Task

Buat Source S3 Bucket di Source Account (A) dan Upload file yang akan ditransfer

Log-in ke Source Account (A) dan buat Source S3 Bucket.
Masukkan nama dan biarkan setting lain dalam setting default.
Bucket Policy akan disetting pada langkah berikut.

Upload file yang akan ditransfer.

Buat Destination S3 Bucket di Destination Account (B)

Log-in ke Destionation Account (B) dan buat Destination S3 Bucket.
Masukkan nama dan biarkan setting lain dalam setting default.
Bucket Policy akan pada Bucket ini tidak perlu dilakukan.

Buat IAM roles datasync-config-role dan datasync-transfer-role di Destination Account (B)

Log-in ke Destination Account (B) dan buat IAM Role datasync-config-role (Digunakan dalam setting DataSync) dan IAM Role datasync-transfer-role (digunakan saat membuat Source S3 Location).

IAM Role > Create Role > Trusted Entity Type: AWS Service (DataSync) > Create and Attach Policy

Trust Relationships kedua Role adalah AWS Serive (DataSync).

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "datasync.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Policy yang diperlukan untuk masing-masing adalah sebagai berikut.
Tidak ada Policy tambahan lain yang diperlukan.

  • datasync-config-role
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<Destination S3 Bucket>"
        },
        {
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:GetObjectTagging",
                "s3:PutObjectTagging",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<Destination S3 Bucket>/*"
        }
    ]
}
  • datasync-transfer-role
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<Source S3 Bucket>"
        },
        {
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:GetObjectTagging",
                "s3:PutObjectTagging",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<Source S3 Bucket>/*"
        }
    ]
}

Setting Bucket Policy untuk Source S3 Bucket di Source Account (A)

Setting sebagai berikut.
Bagian "AWS": "arn:aws:sts:::user/" diisi oleh hasil Command AWS CLI aws sts get-caller-identity pada Destination Account.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<Destination Account>:role/datasync-config-role",
                    "arn:aws:iam::<Destination Account>:role/datasync-transfer-role"
                ]
            },
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": "arn:aws:s3:::<Source S3 Bucket>"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<Destination Account>:role/datasync-config-role",
                    "arn:aws:iam::<Destination Account>:role/datasync-transfer-role"
                ]
            },
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:PutObjectTagging",
                "s3:GetObjectTagging",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::<Source S3 Bucket>/*"
        },
        {
            "Sid": "DataSyncCreateS3Location",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:sts::<Destination Account>:user/<Username>"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<Source S3 Bucket>"
        }
    ]
}

Buat Source S3 Location dengan AWS CLI di Destination Account (B)

Jalankan Command berikut di AWS CLI. Bagian --region dapat disesuaikan dengan Region yang digunakan.

aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::<Source S3 Bucket> --s3-storage-class STANDARD --s3-config BucketAccessRoleArn="arn:aws:iam::<Destination Account>:role/datasync-transfer-role" --region ap-northeast-1

Jika berhasil, hasil berikut akan ditampilkan pada AWS CLI dan membuat Source S3 Location.

{
    "LocationArn": "arn:aws:datasync:ap-northeast-1:<Destination Account>:location/loc-xxxxxxxxxxxxx9c15"
}

Buat Destination S3 Location di Destination Account (B)

Buat Destination S3 Location dengan setting berikut.

  • Location Type: S3
  • S3 bucket: Destination S3 Bucket
  • IAM Role: arn:aws:iam:::role/datasync-config-role

Berikut merupakan Destination S3 Location yang telah dibuat.

Buat Task di Destination Account (B) dan jalankan Task

Pilih setting berikut untuk buat Task.
Biarkan setting lain dalam setting default.

  • Source S3 location → Select Existing Location: Source location
  • Destination S3 Location → Select Existing Location: Destination Location

Jalankan Task yang telah dibuat.

Jika dari status Running berubah ke Available, transfer data telah selesai.

Dapat dilihat bahwa data berhasil ditransfer ke Destination S3 Bucket.

Penutup

Mentransfer data Amazon S3 pada Cross Account dapat dilakukan dengan menggunakan AWS DataSync.
Berhati-hati dalam melakukan setting IAM Role dan Bucket Policy dari Source Account dan Destination Account karena sangat mudah terjadi Error.
Walaupun pada percobaan kali ini Resource DataSync dibuat di Destination Account, Resource DataSync dapat juga dibuat di Source Account.
Semoga blog ini bermanfaat bagi banyak pembaca.

Referensi

Mengenai Annotation Inc.

Annotation Inc., sebagai perusahaan grup dari Classmethod, terus menjawab tantangan untuk menjadi perusahaan yang dapat memberikan "Operational Excellence". Di bawah slogan “Work and live as you like”, anggota kami yang beragam dengan berbagai latar belakang terus memberikan layanan kepada pelanggan melalui gaya kerja yang sangat fleksibel. Kami sedang mencari anggota baru untuk bergabung dengan perusahaan kami. Jika Anda tertarik, kunjungi situs web Annotation Inc.