LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-12

スクリーンショット 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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0