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

![スクリーンショット 2019-03-09 17.32.30.png](https://qiita-image-store.s3.amazonaws.com/0/280929/31424a4b-479f-433b-a28a-efb3d8d651e2.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とは？](https://qiita.com/voyage_nh/items/3774bbbed7c767e98ea4)
[AWS SDK for PHP バージョン 3 のインストール](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/getting-started_installation.html)

```
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar require aws/aws-sdk-php
```

##3.PHPファイルの作成##

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

```
$ mkdir test
$ cd test
```

```php: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();
}
```

```php: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";
}
```

```php: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
```