📝

CDK で S3 から S3 への DataSync タスクを作成してみた

に公開

Configuring AWS DataSync transfers with Amazon S3 - AWS DataSync
CDK でシンプルに実装してみました。

前提条件

  • CDK 実行環境は Cloud9
  • 既存の S3 バケットを使用
  • ソース S3 バケットには test.txt をアップロード済み

01. CDK プロジェクト作成

$ mkdir -p ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
$ npm install -g typescript
$ tsc -v
Version 5.7.3

$ mkdir alb-cognito-ec2
$ cd alb-cognito-ec2
$ cdk init app --language typescript

CDK コード

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as datasync from 'aws-cdk-lib/aws-datasync';
import * as iam from 'aws-cdk-lib/aws-iam';

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

    // 既存のS3バケットを参照
    const sourceBucket = s3.Bucket.fromBucketName(this, 'SourceBucket', 'datasync-test-source-20250801');
    const destinationBucket = s3.Bucket.fromBucketName(this, 'DestinationBucket', 'datasync-test-destination-20250801');
    
     // DataSync用のIAMロールを作成
    const dataSyncRole = new iam.Role(this, 'DataSyncRole', {
      assumedBy: new iam.ServicePrincipal('datasync.amazonaws.com'),
      description: 'Role for DataSync to access S3 buckets',
      managedPolicies: [
        iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonS3FullAccess')
      ]
    });
    
    // DataSyncのソースロケーション(S3)を作成
    const sourceLocation = new datasync.CfnLocationS3(this, 'SourceLocation', {
      s3BucketArn: sourceBucket.bucketArn,
      s3Config: {
        bucketAccessRoleArn: dataSyncRole.roleArn,
      },
      subdirectory: '/', // バケットのルートディレクトリを指定
    });

    // DataSyncのデスティネーションロケーション(S3)を作成
    const destinationLocation = new datasync.CfnLocationS3(this, 'DestinationLocation', {
      s3BucketArn: destinationBucket.bucketArn,
      s3Config: {
        bucketAccessRoleArn: dataSyncRole.roleArn,
      },
      subdirectory: '/', // バケットのルートディレクトリを指定
    });
    
     // DataSyncタスクを作成
    const dataSyncTask = new datasync.CfnTask(this, 'DataSyncTask', {
      sourceLocationArn: sourceLocation.attrLocationArn,
      destinationLocationArn: destinationLocation.attrLocationArn,
      name: 'S3-to-S3-DataSync-Task',
      options: {
        // ファイルの上書き設定
        overwriteMode: 'ALWAYS',
        // メタデータの保持設定
        preserveDeletedFiles: 'PRESERVE',
        // 転送モード設定
        transferMode: 'CHANGED',
      },
    });

    // タスクARNを出力(後で実行時に使用)
    new cdk.CfnOutput(this, 'DataSyncTaskArn', {
      value: dataSyncTask.attrTaskArn,
      description: 'DataSync Task ARN for S3 to S3 transfer',
    });
  }
}

デプロイ

$ cdk synth
$ cdk deploy

タスク実行

$ aws datasync start-task-execution --task-arn <TaskArn>

$ aws datasync list-task-executions --task-arn <TaskArn>
{
    "TaskExecutions": [
        {
            "TaskExecutionArn": <TaskArn>,
            "Status": "SUCCESS",
            "TaskMode": "BASIC"
        }
    ]
}

# タスク実行完了後にファイルの転送を確認
$ aws s3 ls s3://datasync-test-source-20250801/ --recursive
2025-08-01 00:44:23          5 test.txt

$ aws s3 ls s3://datasync-test-destination-20250801/ --recursive
2025-08-01 01:05:13          5 test.txt

まとめ

今回は CDK で S3 から S3 への DataSync タスクを作成してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion