📝
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