{RDS}Amazon RDS for SQL Server DB インスタンスと Amazon S3 の統合

https://dev.classmethod.jp/articles/rds-sql-server-s3-integration/


Amazon RDS for SQL Server を実行する DB インスタンスAmazon S3 バケットの間でファイルを転送できます。
全てのファイルは DB インスタンスの D:\S3\ に保存されます。

ファイル拡張子がない、または次のファイル拡張子があるファイルのみがダウンロードできます。
.abf、.asdatabase、.bcp、.configsettings、.csv、.dat、.deploymentoptions、.deploymenttargets、.fmt、.info、.ispac、.lst、.tbl、.txt、.xml、および.xmla


作業内容:
S3にファイルをアップロード

S3からD:\S3\へインポート

D:\S3\からDBテーブルへバルクインサート

D:\S3\のファイル削除

 


-- 1. S3バケット作成

aws s3 mb s3://bucket123
aws s3 ls


-- 2. IAMポリシー作成
vim policy01.json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketACL",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::bucket123"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::bucket123/*"
}
]
}

 


aws iam create-policy \
--policy-name policy01 \
--policy-document file://policy01.json

-- 3. IAMロール作成
vim role01.json


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


aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json

-- 4. ポリシーをロールにアタッチ
aws iam attach-role-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy01 \
--role-name role01


-- 5. RDSインスタンス作成


aws rds describe-db-engine-versions \
--engine sqlserver-ex \
| jq -c '.DBEngineVersions[] | [ .Engine, .EngineVersion ]'


aws rds create-db-instance \
--db-instance-identifier sqlserver01 \
--allocated-storage 20 \
--db-instance-class db.t3.small \
--engine sqlserver-ex \
--master-username sa \
--master-user-password 'password' \
--no-multi-az \
--engine-version 15.00.4073.23.v1 \
--storage-type gp2 \
--no-publicly-accessible \
--no-enable-performance-insights \
--no-auto-minor-version-upgrade


aws rds add-role-to-db-instance \
--db-instance-identifier sqlserver01 \
--feature-name S3_INTEGRATION \
--role-arn arn:aws:iam::999999999999:role/role01


-- 6. 動作確認


-- S3にファイルをアップロード
vim tab1.txt
1,AAAAAAAAAA
2,BBBBBBBBBB

aws s3 cp tab1.txt s3://bucket123
aws s3 ls s3://bucket123

 

-- Amazon S3 バケットから SQL Server DB インスタンスにファイルをダウンロードする
exec msdb.dbo.rds_download_from_s3
@s3_arn_of_file='arn:aws:s3:::bucket123/tab1.txt',
@rds_file_path='D:\S3\tab1.txt',
@overwrite_file=1;


-- 各種タスクのステータスをモニタリングする
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,10);


※第2引数はtask_idを指定する

 

-- RDS DB インスタンスでのファイル一覧表示
exec msdb.dbo.rds_gather_file_details;

SELECT * FROM msdb.dbo.rds_fn_list_file_details(10);

※第1引数はtask_idを指定する


-- バルクインサート

BULK INSERT test.dbo.tab1 from 'D:\S3\tab1.txt' with ( FIELDTERMINATOR = ',' ,ROWTERMINATOR = '0x0A')

 

-- RDS DB インスタンスでのファイル削除
exec msdb.dbo.rds_delete_from_filesystem @rds_file_path='D:\S3\tab1.txt';


-- 7. クリーンアップ

-- RDSインスタンス削除

aws rds delete-db-instance \
--db-instance-identifier sqlserver01 \
--skip-final-snapshot

 

-- ロールの一覧
aws iam list-roles | grep role01

-- ロールの削除

aws iam detach-role-policy \
--role-name role01 \
--policy-arn arn:aws:iam::999999999999:policy/policy01


aws iam delete-role --role-name role01

-- ポリシーの一覧
aws iam list-policies | grep policy01

-- ポリシーの削除
aws iam delete-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy01


-- バケット一覧
aws s3 ls

-- バケット削除
aws s3 rb s3://bucket123 --force