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
<?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();
}
<?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";
}
<?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;
}
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