{RDS}Amazon S3 データを RDS for PostgreSQL DB インスタンスにインポートする

-- 1. S3バケット作成

aws s3 mb s3://bucket123
aws s3 ls


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


{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "s3import",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"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. RDSインスタンスの作成
aws rds describe-db-engine-versions \
--engine postgres \
| jq -c '.DBEngineVersions[] | [ .Engine, .EngineVersion ]'


aws rds create-db-instance \
--db-instance-identifier postgres01 \
--allocated-storage 20 \
--db-instance-class db.t3.micro \
--engine postgres \
--master-username postgres \
--master-user-password 'password' \
--no-multi-az \
--engine-version 13.3 \
--storage-type gp2 \
--no-publicly-accessible \
--no-enable-performance-insights \
--no-auto-minor-version-upgrade

 

-- 6. IAMロールをインスタンスに関連付ける

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

 

-- 7. PostgreSQL 拡張機能をインストール
CREATE EXTENSION aws_s3 CASCADE;

\dx

-- 8. テスト用テーブル、インポート用テキストファイル作成
create table tab1(col1 int,col2 varchar(100) );

vim tab1.txt
1,AAA
2,BBB
3,CCC

aws s3 ls s3://bucket123

aws s3 cp tab1.txt s3://bucket123

-- 9. S3ゲートウェイエンドポイントの作成

aws ec2 create-vpc-endpoint \
--vpc-endpoint-type Gateway \
--vpc-id vpc-99999999999999999 \
--service-name com.amazonaws.ap-northeast-1.s3 \
--route-table-ids rtb-99999999999999999

 

-- 10. インポート実行

SELECT aws_s3.table_import_from_s3( 'tab1', 'col1,col2', 'DELIMITER '',''', aws_commons.create_s3_uri( 'bucket123', 'tab1.txt', 'ap-northeast-1' ));

入力ファイルの末尾に空行があるとエラーとなる


select * from tab1;


-- 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


-- RDSインスタンス削除
aws rds delete-db-instance \
--db-instance-identifier postgres01 \
--skip-final-snapshot


-- S3ゲートウェイエンドポイントの削除
aws ec2 describe-vpc-endpoints

aws ec2 delete-vpc-endpoints \
--vpc-endpoint-ids vpce-99999999999999999