PHP
AWS
EC2
S3
RDS

S3バケットからデータを取得しBatchサーバからRDSへ

スクリーンショット 2019-03-09 17.32.30.png

S3バケットから取得しBatchサーバから、RDSに流す。


■事前準備

EC2

Webサーバ

セキュリティグループ:SSHとHTTP

※WebサーバはRDSからindex.phpで公開可能なものとする。

EC2

Batchサーバ

セキュリティグループ:SSH

RDS

MYSQL

セキュリティグループ:SSH(ソースはWebサーバからのみアクセスを受けつけるようにする)、MYSQL(ソースはWebサーバとBatchサーバから受けつけるようにする)

IAM

IAMユーザの「認証情報」から「アクセスキーの作成」でアクセスキーとシークレットキーを用意しておく。

※このユーザーの権限でPHPを動かすぞーというのを定義していくために後でアクセスキーが必要になります。


1.Batchサーバへアクセスキーとシークレットキーを登録する

S3からCSVを取得できるように、Batchサーバへ事前準備で発行したIAMユーザーのアクセスキーとシークレットキーを登録します。

リージョンは東京リージョンを指定しているので、ap-northeast-1 です。

フォーマットは、json にしておきます。

$ aws configure

AWS Access Key ID [None]: ***
AWS Secret Access Key [None]:***
Default region name [None]: ap-northeast-1
Default output format [None]: json

ちなみに

aws configure —-profile xxx

とすると別のユーザーに切り替えることができる。


2.AWS SDK for PHP の導入

コンポーザーを使ってインストールしていきます。

参考

composerとは?

AWS SDK for PHP バージョン 3 のインストール

$ curl -sS https://getcomposer.org/installer | php

$ php composer.phar require aws/aws-sdk-php


3.PHPファイルの作成

testフォルダを作成し、必要なPHPファイルを用意しておく。

$ mkdir test

$ cd test


DbUploadFromCSV.php

<?php

require '../vendor/autoload.php';
use Aws\S3\S3Client;
# TODO: バケット名を各自入力してください
const BUCKET_NAME = '***';
const FILE_NAME = 'data.csv';
$s3 = new S3Client([
'profile' => 'default',
'version' => 'latest',
'region' => 'ap-northeast-1'
]);
try {
// Get the object.
$result = $s3->getObject([
'Bucket' => BUCKET_NAME,
'Key' => FILE_NAME,
'SaveAs' => FILE_NAME
]);
echo $result['Body'];
} catch (S3Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
try {
# TODO:
# xxx は RDS のホスト名に置き換えてください
# zzz は RDS で設定したパスワードに置き換えてください
$dbh = new PDO(
'mysql:host=xxx; dbname=simple_blog',
"root",
"zzz",
array(PDO::MYSQL_ATTR_LOCAL_INFILE => true)
);
$truncateQuery = "TRUNCATE posts;";
$sth = $dbh->exec($truncateQuery);
$loadDataQuery = "LOAD DATA LOCAL INFILE './data.csv' INTO TABLE posts fields terminated by ',';";
$sth = $dbh->exec($loadDataQuery);
$dbh = null;
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "<br/>";
die();
}


ListBuckets.php

<?php

require '../vendor/autoload.php';
use Aws\S3\S3Client;
$s3 = new S3Client([
'profile' => 'default',
'version' => 'latest',
'region' => 'ap-northeast-1'
]);
# バケット一覧の表示
$result = $s3->listBuckets();
foreach ($result['Buckets'] as $bucket) {
echo $bucket['Name'] . "\n";
}


PutObject.php

<?php

require '../vendor/autoload.php';
use Aws\S3\S3Client;
# TODO: バケット名を各自入力してください
const BUCKET_NAME = '***';
const FILE_NAME = 'data.csv';
$s3 = new S3Client([
'profile' => 'default',
'version' => 'latest',
'region' => 'ap-northeast-1'
]);
# ファイルアップロード
try {
$result = $s3->putObject(array(
'Bucket' => BUCKET_NAME,
'Key' => FILE_NAME,
'Body' => fopen(FILE_NAME, 'r')
));
} catch (S3Exception $e) {
echo $e->getMessage() . PHP_EOL;
}


data.csv

1,title1-from-S3,detail1,./img/img1.jpeg

2,title2-from-S3,detail2,./img/img2.jpeg

まず、ListBuckets.php の中身を確認すると、S3バケットがあることが確認できる。

$ php ListBuckets.php 

leon-maron-3224

PutObject.php を実行する。

$ php PutObject.php 

Putしたイメージが2つあることがわかる。

$ php DbUploadFromCSV.php

1,title1-from-S3,detail1,./img/img1.jpeg
2,title2-from-S3,detail2,./img/img2.jpeg