IAMロールを作成する

IAMロールを作成する
ポリシーには以下二つの権限をつける。
-AWSLambdaBasicExecutionRole
-AmazonS3FullAccess

'use strict';

const aws = require('aws-sdk');
const s3 = new aws.S3();

exports.handler = function(event, context){
	console.log('Received event:', JSON.stringify(event, null, 2));

	const uploadBucket = event.Records[0].s3.bucket.name;
	const key = event.Records[0].s3.object.key;

	const params = {
		Bucket: uploadBucket,
		Key: key
	};
	s3.getObject(params, function(err, data){
		if(err){
			console.log(err, err.stack);
			context.done(err, err.stack);
		} else {
			console.log('data: ', data);

			const copyBucket = 'sample-copy-bucket';
			const params = {
				Bucket: copyBucket,
				Key: key,
				Body: data.Body
			};
			s3.putObject(params, function(err, data){
				if(err){
					console.log(err, err.stack);
					context.done(err, err.stack);
				} else {
					console.log('data: ', data);
					context.suceed('complete!');
				}
			});
		}
	});
};

amazon lambdaとは?

amazon lambdaとは?
– 事前に定義したコードを実行するサービス
– 処理のトリガは何かしらのイベント(s3にファイル配置、ストリームデータ受信など)
– node.js//javaで実装
– サーバ、ロギング、スケーリングなどインフラ設計・管理が不要
– 実行回数によって課金

aws cloudTrail -> Source Bucket -> Amazon S3 -> AWS Lambda -> Lambda Function -> Access Policy -> Topic -> Amazon SNS

s3でbucketを作成します。

iamからロールを作成します。

s3を画像のcdnとして使おう

まずs3のバケットに画像をuploadして、パブリックのアクセス権を付与します。

できました。

取得した画像を別のドメインから接続します。

<img src="https://s3-ap-northeast-1.amazonaws.com/capital-technology/20181010114846.gif">

OK!

AWSには、ElastiCacheがあるようですね。
elastiCacheとは?
>ElastiCache は、クラウド内の分散型インメモリデータストア環境またはインメモリキャッシュ環境のセットアップ、管理、およびスケーリングが簡単になるウェブサービス
redisみたいなものか?

cloudfront

cloud front
-> 負荷を分散させ、大量のリクエストに対する対策を実施、通信にかかるレイテンシ(遅延)を改善

Amazon CloudFrontは、Amazon Web Services(AWS)のCDN(コンテンツデリバリネットワーク)サービス
– コンテンツファイルをサーバーから直接配信せず、CDNを介してユーザーに配信
– コンテンツをCloudFrontから配信すると、サーバーへのアクセスを減らせます。動的コンテンツをキャッシュすれば、データベースの負荷軽減も可能
– コンテンツがキャッシュされている限り、ユーザーは安定したレスポンスを得られる

localのcsvをmysqlにインポートする

1. まずdatabaseをつくります。
mysql> CREATE DATABASE click;
Query OK, 1 row affected (0.00 sec)

mysql> use click;

2. 続いて、tableを作ります。
mysql> create table articles(
-> id int primary key auto_increment,
-> login_id varchar(30),
-> role varchar(50),
-> name varchar(20),
-> password varchar(30),
-> mail varchar(255),
-> test_mail varchar(255),
-> updated_person varchar(50),
-> created_at datetime,
-> updated_at datetime
-> );

mysql> select * from articles;
Empty set (0.00 sec)

s3から取得したcsvをopenして1行目のカラムを飛ばしてmysqlにinsertしていきます。

try {
	$dbh = new PDO('mysql:host=localhost;dbname=click;charset=utf8','hoge','hogehoge', array(PDO::ATTR_EMULATE_PREPARES => false));
} catch(PDOException $e){
	exit('データベース接続失敗。'.$e->getMessage());
}

$stmt = $dbh->prepare('INSERT INTO articles VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?,?)');

$dbh->beginTransaction();
$fp = fopen('article.csv', 'rb');
$i = 0;
while ($row = fgetcsv($fp)){
	if($i == 0){
		$i++;
		continue;
	}
	if ($row === array(null)){
		continue;
	}
	$executed = $stmt->execute($row);
	$i++;
}
fclose($fp);
$dbh->commit();

確認してみましょう。

mysql> select * from articles;
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
| id | login_id | role | name | password | mail | test_mail | updated_person | created_at | updated_at |
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
| 1 | user1 | master | taniguchi | passowrd | laravel@gmail.com | laravel_test@gmail.com | sasaki | 2018-09-21 21:39:07 | 2018-09-21 21:39:07 |
| 2 | user2 | master | goto | himitsu | laravel@hotmail.com | laravel_test@hotmail.com | sasaki | 2018-09-22 08:31:54 | 2018-09-22 08:51:32 |
| 3 | user3 | master | 橋本太郎 | password3 | laravel@gmail.com | laravel_test@gmail.com | こばやし | 2018-09-22 15:03:11 | 2018-09-22 15:03:11 |
| 4 | user4 | master | 後藤大輔 | password4 | laravel@gmail.com | laravel_test@gmail.com | こばやし | 2018-09-22 15:48:56 | 2018-09-22 15:48:56 |
| 9 | user2 | master | goto | himitsu | laravel@hotmail.com | laravel_test@hotmail.com | sasaki | 2018-09-22 17:41:59 | 2018-09-22 17:41:59 |
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
5 rows in set (0.00 sec)

おいおいおい、やべーことになってる。
とりあえず、laravel -> mysql(1) -> csv -> s3 upload -> s3 import -> csv -> mysql(2)の流れは出来た。やはり、laravelが時間かかったな。frameworkの習得は時間がかかる。s3はセキュリティ周りをもっと学習する必要がある。
next
-> SSL
-> githubからdeploy

csvをs3にアップロードしよう

composerを入れます。
[vagrant@localhost s3]$ curl -sS https://getcomposer.org/installer | php

aws sdkをインストール
[vagrant@localhost s3]$ php composer.phar require aws/aws-sdk-php

consoleでs3のバケットを作成する。

upload

require_once('vendor/autoload.php');

$s3client = new Aws\S3\S3Client([
	'credentials' => [
		'key' => 'A',
		'secret' => ''
	],
	'region' => 'ap-northeast-1',
	'version' => 'latest',
]);

$result = $s3client->putObject([
	'Bucket' => '',
	'Key' => 'article.csv',
	'SourceFile' => 'article.csv',
	'ContentType' => mime_content_type('article.csv'),
]);

おいおいおい、まじかー

まじかー。2回言ってしまった。

次はuploadしたS3のバケットからCSVをダウンロードして、mysqlの異なるdb・tableにinsertする。

Amazon EBS

What is Amazon EBS?

Amazon Elastic Block Store (Amazon EBS) provides persistent block level storage volumes for use with Amazon EC2 instances in the AWS Cloud. Each Amazon EBS volume is automatically replicated within its Availability Zone to protect you from component failure, offering high availability and durability. Amazon EBS volumes offer the consistent and low-latency performance needed to run your workloads. With Amazon EBS, you can scale your usage up or down within minutes – all while paying a low price for only what you provision.

ec2にアタッチ

modify volume

Elastic File System(EFS)

EC2 に行き、セキュリティグループを触ります。

-ファイルシステムの作成
何やってるか、わからなくなってくる。

ファイルシステムへのアクセス

VPC、アベイラビリティゾーン、サブネット、IPアドレス、セキュリティグループがあります。

puttyでec2にログインします。

mount instruction

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-7ac198b3.efs.eu-west-1.amazonaws.com:/ efs

[ec2-user@ip-10-0-1-61 ~]$ sudo df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 488M 56K 488M 1% /dev
tmpfs tmpfs 497M 0 497M 0% /dev/shm
/dev/xvda1 ext4 7.8G 1.2G 6.5G 16% /

sudo fio –name=fio-efs –filesize=10G –filename=./efs/fio-efs-test.img –bs=1M –nrfiles=1 –direct=1 –sync=0 –rw=write –iodepth=200 –ioengine=libaio

CloudWatch

なんだこれ、凄いな。

CloudFront

ネットワーキング & コンテンツ配信ですね。

CloudFront distributionでS3を選択します。

Distribution ID E3U6CEULBHSZIB
ARN arn:aws:cloudfront::838236696057:distribution/E3U6CEULBHSZIB
Log Prefix –
Delivery Method Web
Cookie Logging Off
Distribution Status InProgress
Comment –
Price Class Use All Edge Locations (Best Performance)
AWS WAF Web ACL –
State Enabled
Alternate Domain Names (CNAMEs) –
SSL Certificate Default CloudFront Certificate (*.cloudfront.net)
Domain Name d24aew1nc9kquu.cloudfront.net
Custom SSL Client Support –
Security Policy TLSv1
Supported HTTP Versions HTTP/2, HTTP/1.1, HTTP/1.0
IPv6 Enabled
Default Root Object –
Last Modified 2018-08-28 21:03 UTC+9
Log Bucket

deployに15~20分かかるとのこと。

Amazon

概念図

Lambda Node.js 8.10を選択します。
index.jsをsetする。

新規API

{“q”:”How do I compile my AWS Lambda function Java code?”,”a”:”You can use standard tools like Maven or Gradle to compile your Lambda function. Your build process should mimic the same build process you would use to compile any Java code that depends on the AWS SDK. Run your Java compiler tool on your source files and include the AWS SDK 1.9 or later with transitive dependencies on your classpath. For more details, see our documentation.”}

う~ん、よくわからん。lambdaと組み合わせて使ってますね。他も、AWSのメニューとの組み合わせが多いですな。