手を動かしながら2週間で学ぶ AWS 基本から応用まで Day7

Day7 オブジェクトストレージS3を使ってみる

S3について

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html

広範にわたるユースケースのデータを容量に関係なく、保存して保護することができます。Amazon S3 では使いやすい管理機能を使用するため、データを整理して、細かく調整されたアクセス制御を設定することで、特定のビジネスや組織、コンプライアンスの要件を満たすことができます。Amazon S3 は 99.999999999% (9 x 11) の耐久性を実現するように設計されています。

イレブン・ナインの耐久性

  • アクセス管理
    IAMユーザ単位・バケット単位でのアクセス管理

  • Webサイトホスティング機能
    静的なサイトであればS3だけで公開可能

  • 他のAWSサービスとの連携
    Lambdaとの連携

1. S3からcsvファイルを取得し、RDSを更新する

f:id:kyamashiro:20190121220938p:plain

S3バケットを作りファイルをアップロードする

S3→バケットの作成
バケット名は全世界ユニーク
リージョン:アジア東京
オプションの設定:デフォルト
アクセス許可の設定:デフォルト
バケットを作成

適当にファイルをアップロード

2. PHPでS3からファイルを取得し、RDSデータを更新する

EC2でBatchサーバを作る

EC2→インスタンスの作成
public-1cにBatchサーバを作る
サブネット:public-1c

高度な詳細:

#!/bin/bash
# ホスト名
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=udemy-aws-14days-batch/g' /etc/sysconfig/network
hostname 'udemy-aws-14days-batch'
# タイムゾーン
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo"|g' /etc/sysconfig/clock
# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
# 必要なパッケージの導入
sudo yum update -y
sudo yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
sudo yum install -y mysql
sudo yum install -y git

新しいセキュリティグループ:Batch-sg
ルール:デフォルト

  • RDSの設定
    BatchサーバからmysqlコマンドでRDSインスタンスにつなげるようにする
    EC2→セキュリティグループ→DB-sg→インバウンド→編集
    3306ポートのソースにBatch-sgを追加

IAMユーザ
認証情報→アクセスキーの作成

Batchサーバへ接続

ssh -i key-pair.pem ec2-user@ipv4

RDSサーバへmysqlコマンドで接続

mysql -h RDSエンドポイント -u root -p

BatchサーバへIAMユーザのアクセスキーの登録

aws configure
Access Key ID:
Secret Access Key:
Default region name: ap-northeast-1
Output Format: json

# AWS SDK for PHP
curl -sS https://getcomposer.org/installer | php
php composer.phar require aws/aws-sdk-php

# GitHub から PHPコードを取得する
git clone https://github.com/ketancho/udemy-aws-14days.git
mkdir src
cd src
cp -r ../udemy-aws-14days/Day7/src-s3-sample/* .

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";
}

S3のバケットが表示される

<?php
require '../vendor/autoload.php';

use Aws\S3\S3Client;

# TODO: バケット名を各自入力してください
const BUCKET_NAME = 's3-sample';
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;
}

S3バケットCSVがアップロードされる

<?php
require '../vendor/autoload.php';

use Aws\S3\S3Client;

# TODO: バケット名を各自入力してください
const BUCKET_NAME = 's3-sample';
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= ; dbname=simple_blog',
    "root",
    "password",
    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();
}

RDSのDBが更新される

3. 静的ホスティング機能を利用する

S3バケットの作成 プロパティ→static website hosting このバケットを使用してウェブサイトをホストする

パブリックアクセス設定 新規のパブリックバケットポリシーをブロックするのチェックを外す

アクセス権限→バケットポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::(***bucket-nameに置き換える***)/*"
        }
    ]
}

index.htmlのアップロード
S3のstatic website hostingのエンドポイント
http://S3バケット名.s3-website-ap-northeast-1.amazonaws.com/

で静的サイトが見れる