{Aurora}Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード

-- 1. S3バケット作成

aws s3 mb s3://bucket123
aws s3 ls


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


{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAuroraToExampleBucket",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:AbortMultipartUpload",
"s3:ListBucket",
"s3:DeleteObject",
"s3:GetObjectVersion",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::bucket123/*",
"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. クラスタパラメータグループ作成
aws rds create-db-cluster-parameter-group \
--db-parameter-group-family aurora-mysql5.7 \
--db-cluster-parameter-group-name cpg01 \
--description cpg01

vim a.json
[
{
"ParameterName": "aurora_select_into_s3_role",
"ParameterValue": "arn:aws:iam::999999999999:role/role01",
"ApplyMethod": "immediate"
},
{
"ParameterName": "aurora_load_from_s3_role",
"ParameterValue": "arn:aws:iam::999999999999:role/role01",
"ApplyMethod": "immediate"
},
{
"ParameterName": "aws_default_s3_role",
"ParameterValue": "arn:aws:iam::999999999999:role/role01",
"ApplyMethod": "immediate"
}
]

aws rds modify-db-cluster-parameter-group \
--db-cluster-parameter-group-name cpg01 \
--parameters file://a.json

-- 6. クラスタの作成

aws rds create-db-cluster \
--db-cluster-identifier cluster11 \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.10.0 \
--master-username root \
--master-user-password 'password' \
--db-cluster-parameter-group-name cpg01

aws rds create-db-instance \
--db-instance-identifier cluster11-instance01 \
--db-cluster-identifier cluster11 \
--db-instance-class db.t3.small \
--engine aurora-mysql \
--no-auto-minor-version-upgrade


-- 7. IAMロールをクラスタに関連付ける

aws rds add-role-to-db-cluster \
--db-cluster-identifier cluster11 \
--role-arn arn:aws:iam::999999999999:role/role01

-- 8. テスト用ユーザとデータの作成
create user 'user1'@'%' identified by 'password';

grant all on test.* to 'user1'@'%';
GRANT SELECT INTO S3 ON *.* TO 'user1'@'%';
GRANT LOAD FROM S3 ON *.* TO 'user1'@'%';

SHOW GRANTS FOR 'user1'@'%';

※DB クラスターのマスターユーザー名にはデフォルトで SELECT INTO S3 権限が付与されます。
※DB クラスターのマスターユーザー名にはデフォルトで LOAD FROM S3 権限が付与されます。

create database test;
use test;
create table tab1(col1 int primary key,col2 varchar(10) );

insert into tab1 values(1,'AAA');
insert into tab1 values(2,'BBB');
insert into tab1 values(3,'CCC');
insert into tab1 values(4,'DDD');

select * from tab1;

-- 9. S3へのデータアンロード

SELECT * FROM tab1
INTO OUTFILE S3 's3://bucket123/tab1'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
;

ERROR 63994 (HY000): S3 API returned error: Missing Credentials: Cannot instantiate S3 Client
→ IAMロールをクラスタに関連付けるのに少し時間がかかる。少し待てばこのエラーは消える

ERROR 63994 (HY000): S3 API returned error: Network Connection:Unable to connect to endpoint

→ S3ゲートウェイエンドポイントを作成してエラー解消
VPC: Auroraが使用しているVPC
ルートテーブル: Auroraが使用しているルートテーブル
ポリシー: フルアクセス


aws s3 ls s3://bucket123


-- 10. S3からデータロード

truncate table tab1;
select * from tab1;

LOAD DATA FROM S3 's3://bucket123/tab1.part_00000'
INTO TABLE tab1
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(col1,col2);

select * from tab1;

select * from mysql.aurora_s3_load_history;

 

-- 11. クリーンアップ

-- ロールの一覧
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


-- クラスタ削除
aws rds delete-db-instance \
--db-instance-identifier cluster11-instance01 \
--skip-final-snapshot

aws rds delete-db-cluster \
--db-cluster-identifier cluster11 \
--skip-final-snapshot

-- クラスタパラメータグループ削除
aws rds delete-db-cluster-parameter-group --db-cluster-parameter-group-name cpg01

 

-- S3ゲートウェイエンドポイントの削除