- EC2をSFTPサーバとして外部からファイルを受け取る
- EC2はファイルのバリデーションをしてS3と必要なデータをSync
- HerokuのアプリケーションがS3からデータ取得
Amazon S3
とりあえずS3の設定をしてみます。このチュートリアル(Get Started With Amazon Simple Storage Service)に従って進めたらBucketを作ってAmazonのコンソールからファイルをアップロードする所まではすぐにできました。
まずはBucketを作ります。
とりあえずRegionはHerokuに合わせてUSにしておく。
$heroku info
=== $server_name
Addons: heroku-postgresql:dev
Git URL: git@heroku.com:$server_name.git
Owner Email: test@example.com
Region: us
Repo Size: 2M
Slug Size: 36M
Stack: cedar
Tier: Legacy
Web URL: http://$server_name.herokuapp.com/
Amzon S3のConsoleから管理ができる。
Amazon EC2
次にFTP Server / Batch Serverとして使うEC2の設定です。これも基本的にはAmazonのチュートリアル(Getting Started with Amazon EC2 Linux Instances)通りに進めればすぐにインスタンスが立てられます。まずはOSを選ぶんですがAmazon Linux、Red Hat、SUSE、UbuntuからWindowsまで選択肢が多くて困る。Debianに慣れているしUbuntu AMIにしようかとも思ったけれども、無難にAmazon Linux AMIにした。とりあえず基本的なパッケージが安全に動けば良いし、AmazonのDocumentもAmazon Linuxを基準にしてあるみたいなので。
後はメモリやCPUやストレージサイズなどを適当に選んでいけばインスタンスが立ちます。最後にKey Pairが作れるのでそのPrivate Keyを使ってsshで接続すればすぐにLoginできます。
$ ssh -i ~/.ssh/amazon_ec2.pem ec2-user@pub_dns
Last login: Mon Nov 25 10:14:54 2013 from host
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
これもAmazon EC2のConsoleからInstance増やしたりVolume追加したりなどの管理ができます。
ついでにEBS Volumeの作成とマウントもしといた。VolumeはEC2のコンソールから作るだけ。初回のみはVolumeのフォーマットが必要なので注意。でないとマウントでエラーになります。とりあえずext4にしといた。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.9G 1023M 6.8G 13% /
tmpfs 298M 0 298M 0% /dev/shm
$ sudo mkfs -t ext4 /dev/xvdf
mke2fs 1.42.3 (14-May-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
$ sudo mkdir /mnt/ebs
$ sudo mount /dev/sdf /mnt/ebs
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.9G 1023M 6.8G 13% /
tmpfs 298M 0 298M 0% /dev/shm
/dev/xvdf 5.0G 138M 4.6G 3% /mnt/ebs
EC2からS3へのデータ転送
まずは例のごとくAmazonのドキュメントを見ながらCliの初期設定をします(Getting Set Up with the AWS Command Line Interface)。Access Keyの設定とかPythonライブラリのインストールとかあって若干めんどくさい。
Pythonで書かれてるらしいんだけど、Localeの設定をしてあげないと以下のように盛大に死ぬので注意。
$ aws
Traceback (most recent call last):
File "/usr/bin/aws", line 15, in
import awscli.clidriver
File "/usr/lib/python2.6/site-packages/awscli/clidriver.py", line 29, in
from awscli.help import ProviderHelpCommand
File "/usr/lib/python2.6/site-packages/awscli/help.py", line 20, in
from docutils.core import publish_string
File "/usr/lib/python2.6/site-packages/docutils/core.py", line 20, in
from docutils import frontend, io, utils, readers, writers
File "/usr/lib/python2.6/site-packages/docutils/frontend.py", line 41, in
import docutils.utils
File "/usr/lib/python2.6/site-packages/docutils/utils/__init__.py", line 20, in
import docutils.io
File "/usr/lib/python2.6/site-packages/docutils/io.py", line 18, in
from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput
File "/usr/lib/python2.6/site-packages/docutils/utils/error_reporting.py", line 46, in
locale_encoding = locale.getlocale()[1] or locale.getdefaultlocale()[1]
File "/usr/lib64/python2.6/locale.py", line 478, in getdefaultlocale
return _parse_localename(localename)
File "/usr/lib64/python2.6/locale.py", line 410, in _parse_localename
raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8
CredentialsのペアはSecurity Credentialの管理ページから作れる。aws configureでAccess Keyを設定すると~/.aws/configに設定ファイルが作られる。
$ aws configure
AWS Access Key ID [None]: $KEY_ID
AWS Secret Access Key [None]: $SECRET_KEY
Default region name [None]: us-west-2
Default output format [None]: json
やっとアクセスできるようになった。
aws s3 ls s3://arita_test
2013-11-19 17:22:58 300 2013-11-19-17-22-57-69ED20ABB5DBF2F7
2013-11-19 17:27:56 326 2013-11-19-17-27-55-8498FB7A97E32996
2013-11-19 17:31:41 299 2013-11-19-17-31-40-81265F67425272DE
2013-11-19 17:33:08 584 2013-11-19-17-33-07-87A40B3132B18A50
regionの指定で少しハマったけど、US StandardではなくEC2と同じRegionでS3のBucketを作り直したら上手く行った。aws configureで指定したregionと違う場合は--regionオプションで指定してあげないと上手く行かない。
$ aws s3 cp test s3://arita_test/ --region us-east-1
upload: ./test to s3://arita_test/test
$ aws s3 sync s3://arita_test/ s3
download: s3://arita_test/test to s3/test
SFTP用のユーザ作成
さすがにec2-userでファイルを送るのは問題なので、SFTP用のユーザを作成。まぁ、これは素直にUnixのアカウントを作ってsshの設定をしてあげるだけ。
まずはユーザを作って
$ sudo adduser arita
$ sudo passwd arita
Changing password for user arita.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
公開鍵を置いてPerissionの設定。
$ su arita
Password:
$ mkdir .ssh
$ chmod 700 .ssh/
$ vim .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
これでとりあえず、SFTPでデータを置いてS3にSyncするところまでは完成。