AWSの説明ページ

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

 

最少パートサイズ 5MB

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

 

AWS-SDKで試してみたが、やっぱり駄目みたい。

AWS HTTP error: Client error: 400 EntityTooSmall (client): Your proposed upload is smaller than the minimum allowed size –
<Error>
<Code>EntityTooSmall</Code>
<Message>Your proposed upload is smaller than the minimum allowed size</Message>
<ProposedSize>4194304</ProposedSize>
<MinSizeAllowed>5242880</MinSizeAllowed>
<PartNumber>1</PartNumber>
<ETag>xxx</ETag>
<RequestId>xxx</RequestId>
<HostId>xxx=</HostId>
</Error>’

 

PHP + CURLは、MultipartUploadがなぜだかそもそもうまくいってない。

<?xml version=”1.0″ encoding=”UTF-8″?>
<Error>
<Code>RequestTimeout</Code>
<Message>Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed.</Message>
<RequestId>xxx</RequestId>
<HostId>xxx</HostId>
</Error>

 

★アップロード順番は順不同でも、completeMultipartUploadに渡す順序を正しく渡せばOK

$parts = array();

$partNumber = 2;
$file = fopen(‘awssdk-5MB-2’, ‘r’);
$result = $s3->uploadPart(array(
‘Bucket’ => $bucket,
‘Key’ => $keyname,
‘UploadId’ => $uploadId,
‘PartNumber’ => $partNumber,
‘Body’ => fread($file, 10 * 1024 * 1024),
));
fclose($file);

$parts[] = array(
‘PartNumber’ => $partNumber,
‘ETag’ => $result[‘ETag’],
);

$file = fopen(‘awssdk-5MB-1’, ‘r’);
$partNumber = 1;
$result = $s3->uploadPart(array(
‘Bucket’ => $bucket,
‘Key’ => $keyname,
‘UploadId’ => $uploadId,
‘PartNumber’ => $partNumber,
‘Body’ => fread($file, 10 * 1024 * 1024),
));
fclose($file);

$parts[] = array(
‘PartNumber’ => $partNumber,
‘ETag’ => $result[‘ETag’],
);

$parts = array_reverse($parts);

cd /usr/local/src/
wget “http://sourceforge.net/projects/s3tools/files/latest/download?source=files”
mv download\?source\=files s3cmd-1.6.0.tar.gz
tar xvzf s3cmd-1.6.0.tar.gz
cd s3cmd-1.6.0
yum install python-setuptools
python ./setup.py install
s3cmd

 

[nilesflow@tk2-234-26954 glusterfs]$ s3cmd –configure
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: xxx
Secret Key: yyy
Default Region [US]: us-west-2

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: zzz
Path to GPG program [/usr/bin/gpg]:

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]:

New settings:
Access Key: xxx
Secret Key: yyy
Default Region: us-west-2
Encryption password: zzz
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: True
HTTP Proxy server name:
HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] Y
Please wait, attempting to list all buckets…
Success. Your access key and secret key worked fine 🙂

Now verifying that encryption works…
Success. Encryption and decryption worked fine 🙂

Save settings? [y/N] y
Configuration saved to ‘/home/nilesflow/.s3cfg’

 

★PUT

[nilesflow@tk2-234-26954 s3cmd]$ s3cmd put s3cmd.txt s3://nilesflowfirstbucket
‘s3cmd.txt’ -> ‘s3://nilesflowfirstbucket/s3cmd.txt’ [1 of 1]
6 of 6 100% in 0s 72.27 B/s done
‘s3cmd.txt’ -> ‘s3://nilesflowfirstbucket/s3cmd.txt’ [1 of 1]
6 of 6 100% in 0s 42.13 B/s done

 

★マルチパートアップロード 50MB

[nilesflow@tk2-234-26954 s3cmd]$ dd if=/dev/zero of=s3cmd-50MB bs=50MB count=1
1+0 records in
1+0 records out
50000000 bytes (50 MB) copied, 0.191449 s, 261 MB/s
[nilesflow@tk2-234-26954 s3cmd]$ ll

[nilesflow@tk2-234-26954 s3cmd]$ s3cmd put –multipart-chunk-size-mb=5 s3cmd-50MB s3://nilesflowfirstbucket
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 1 of 10, 5MB]
5242880 of 5242880 100% in 0s 14.18 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 2 of 10, 5MB]
5242880 of 5242880 100% in 0s 14.37 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 3 of 10, 5MB]
5242880 of 5242880 100% in 0s 15.60 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 4 of 10, 5MB]
5242880 of 5242880 100% in 0s 12.77 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 5 of 10, 5MB]
5242880 of 5242880 100% in 0s 15.85 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 6 of 10, 5MB]
5242880 of 5242880 100% in 0s 15.12 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 7 of 10, 5MB]
5242880 of 5242880 100% in 0s 18.30 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 8 of 10, 5MB]
5242880 of 5242880 100% in 0s 10.19 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 9 of 10, 5MB]
5242880 of 5242880 100% in 0s 15.32 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 10 of 10, 2MB]
2814080 of 2814080 100% in 0s 5.10 MB/s done

以前触ったけど、残してなかったので今の状態だけ。

 

yum install glusterfs glusterfs-fuse

yum install glusterfs glusterfs-server

 

service glusterd start

 

 

[root@tk2-234-26954 glusterfs]# gluster volume info

Volume Name: gfs
Type: Replicate
Volume ID: 6ae6cc45-59df-4d12-9307-35410214324d
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: primary.gfs.local:/root/glusterfs/primary
Brick2: secondary.gfs.local:/root/glusterfs/secondary
Options Reconfigured:
performance.readdir-ahead: on
[root@tk2-234-26954 glusterfs]# gluster volume status
Status of volume: gfs
Gluster process TCP Port RDMA Port Online Pid
——————————————————————————
Brick primary.gfs.local:/root/glusterfs/pri
mary 49156 0 Y 11647
Brick secondary.gfs.local:/root/glusterfs/s
econdary 49157 0 Y 11665
NFS Server on localhost N/A N/A N N/A
Self-heal Daemon on localhost N/A N/A Y 11697

Task Status of Volume gfs
——————————————————————————
There are no active volume tasks

 

mount

 

[root@tk2-234-26954 glusterfs]# df | grep -E “gfs|glusterfs”
primary.gfs.local:/gfs
18193792 8224512 9038464 48% /root/glusterfs/mount

 

touch /root/glusterfs/mount/7

#primary, secondary 両方にコピー

AWSを利用したクラウドWEBシステムの構築パターンがデザインパターンとして数多く掲載されている。

AWSの知識を深めるために手に取ったが、書かれているデザインパターンはAWSだけで用いられるものではなく、WEBシステム全般に対してのシステム設計レベルでのデザインパターンとも言える。

WEBシステムを構成するにあたりどのような点に気を付けるべきか、どのような技術が必要か、AWSに限らず理解していて全く損のない本。

そういう意味では、「Amazon Web Services~」となっていなければ、もっと万人にリーチできたのかも?とも思ってしまった。

「はじめに」のエピソードにもある通り、システム開発の現場では共通言語があると、単純なコミュニケーションから設計のレビューまで話が早いことが多い。

ここで用いられるデザインパターンが現場で一般言語として使われると良いなと思う。

 

一冊通しで読んだが、正直デザインパターン名が頭に馴染まない。なぜだろう。笑

GoFのデザインパターンはもう少し浸透しやすかった気がしたが・・。

という事で、何度か復習してみようと思う。

 

あと、コーチャンフォーで間違って実装ガイドの方を買ってしまったので、そっちも読んでみよう。

 

 

 

Amazon SESへのProxyで確認

「サーバ名がサーバが期待しているものと違っている」旨のエラーになったので、

メーラで「証明書を検証しない」設定が必要だった。

 

stream {

#SMTP
upstream smtp {
server email-smtp.us-west-2.amazonaws.com:587 weight=5 max_fails=3 fail_timeout=30s;
}

server {
listen 587;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass smtp;
}

upstream smtps {
server email-smtp.us-west-2.amazonaws.com:465 weight=5 max_fails=3 fail_timeout=30s;
}

server {
listen 465;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass smtps;
}

stream {
#FTP
upstream ftp {
server 127.0.0.1:21 weight=5 max_fails=3 fail_timeout=30s;
server 127.0.0.1:10021 weight=5 max_fails=3 fail_timeout=30s;
}

server {
listen 20021;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass ftp;
}

 

と思ったら、vsftpd/pureftpd共に、Passiveコマンドで失敗している

227 Entering Passive Mode (160,16,117,208,47,254)
421 Service not available, remote server has closed connection

 

vsftpdは以下設定で回避できたが、

pasv_promiscuous=yes

 

pure-ftpdは回避できるオプションがなさそう。

 

 

リレーショナルモデルとは何か、を述語論理から解説。

その後、正規化、直交性、ドメインというDB設計の基本を経て、

NULL、履歴、グラフ、インデックス、トランザクションといった実運用への応用を解説。

リファクタリングで実運用を踏まえた解説。

と基礎から応用まで深く広く綺麗に纏まっている。

書籍中にもあるが、業務でデータベースを利用している人が改めてその技術を振り返るのにとても参考になる一冊。

 

述語論理、学生時代に数学で習ったが、リレーショナルデータベースと繋がっていることは今まで知らず、目から鱗だった。

学習時、未来にデータベースを見据えながら理解できれば見え方も違うんだろうな。

わかる人はそれも描きながら学べるんだろうけど。