2013/08/01

Amazon S3 に Web サーバを移しました(その1)

今井です。

最近、ケイフィールドのWebサイトを Amazon S3 に移行しました。

Webサイトは静的なHTMLで構成されていたので S3 に移しても何の問題もないはず、と言う事で早速公式ブログに載っている方法で試してみました。

はじめに

Amazon S3 に移行を完了するまでの手順は

  1. AWSのアカウントを作る
  2. Amazon S3にBucketを作る
  3. BucketをWebサイト用に設定する
  4. アクセスキーを用意する
  5. s3cmdをインストールする
  6. S3にWebサイトデータをアップロードする
  7. DNSの設定を変更する

の6ステップ!!
やってみた感じではもっと簡単な印象だったのですが意外とありますね…

1. AWS のアカウントを作る

はい、このステップは私はやっていません。ケイフィールドで既に持っているアカウントを使いました。

2. Amazon S3 に Bucket を作る

公式ブログの通りです。

Create Bucket を選びます。


Bucket名は公開するWebサイトのURL http://www.kfield.co.jp と同じ名前にします。

ログを取るならログの設定をします。
(2013-08-07 追記:Target Bucket はログ用の Bucket を作って指定することをお勧めします)

これだけです。

3. Bucket を Web サイト用に設定する

これも公式ブログの通りです。

Static Website Hosting の設定をします

アクセス権の設定をします。

公式ブログで紹介されていた通りに設定します。


4. アクセスキーを用意する

(2013-08-07 追記:アクセスキーは下記のように作成するのではなくアップロード専用ユーザーを作成するべきです。続編の手順3.「Webサイトアップロード専用アカウントが欲しい」を参照して下さい)
Amazon S3 に Webサイトデータをアップロードする際に必要なアクセスキーを用意します。
ここで作成したアクセスキーIDとシークレットアクセスキーは s3cmd で Amazon S3 に接続する際に使用します。

5. s3cmd をインストールする

いつものように MacPorts を使ってインストールします。
MacPorts のアップデートもついでにやっておきます。
$ sudo port selfupdate
$ sudo port -v sync
$ sudo port install s3cmd

6. S3にWebサイトデータをアップロードする

s3cmd でサイトをアップロードします

まず、s3cmdの使い方を見てみます。
$ s3cmd --help
表示されたヘルプは次の通り。
Usage: s3cmd [options] COMMAND [parameters]

S3cmd is a tool for managing objects in Amazon S3 storage. It allows for
making and removing "buckets" and uploading, downloading and removing
"objects" from these buckets.

Options:
  -h, --help            show this help message and exit
  --configure           Invoke interactive (re)configuration tool.
  -c FILE, --config=FILE
                        Config file name. Defaults to /Users/xxxxx/.s3cfg
  --dump-config         Dump current configuration after parsing config files
                        and command line options and exit.
  -n, --dry-run         Only show what should be uploaded or downloaded but
                        don't actually do it. May still perform S3 requests to
                        get bucket listings and other information though (only
                        for file transfer commands)
  -e, --encrypt         Encrypt files before uploading to S3.
  --no-encrypt          Don't encrypt files.
  -f, --force           Force overwrite and other dangerous operations.
  --continue            Continue getting a partially downloaded file (only for
                        [get] command).
  --skip-existing       Skip over files that exist at the destination (only
                        for [get] and [sync] commands).
  -r, --recursive       Recursive upload, download or removal.
  --check-md5           Check MD5 sums when comparing files for [sync].
                        (default)
  --no-check-md5        Do not check MD5 sums when comparing files for [sync].
                        Only size will be compared. May significantly speed up
                        transfer but may also miss some changed files.
  -P, --acl-public      Store objects with ACL allowing read for anyone.
  --acl-private         Store objects with default ACL allowing access for you
                        only.
  --acl-grant=PERMISSION:EMAIL or USER_CANONICAL_ID
                        Grant stated permission to a given amazon user.
                        Permission is one of: read, write, read_acp,
                        write_acp, full_control, all
  --acl-revoke=PERMISSION:USER_CANONICAL_ID
                        Revoke stated permission for a given amazon user.
                        Permission is one of: read, write, read_acp, wr
                        ite_acp, full_control, all
  --delete-removed      Delete remote objects with no corresponding local file
                        [sync]
  --no-delete-removed   Don't delete remote objects.
  -p, --preserve        Preserve filesystem attributes (mode, ownership,
                        timestamps). Default for [sync] command.
  --no-preserve         Don't store FS attributes
  --exclude=GLOB        Filenames and paths matching GLOB will be excluded
                        from sync
  --exclude-from=FILE   Read --exclude GLOBs from FILE
  --rexclude=REGEXP     Filenames and paths matching REGEXP (regular
                        expression) will be excluded from sync
  --rexclude-from=FILE  Read --rexclude REGEXPs from FILE
  --include=GLOB        Filenames and paths matching GLOB will be included
                        even if previously excluded by one of
                        --(r)exclude(-from) patterns
  --include-from=FILE   Read --include GLOBs from FILE
  --rinclude=REGEXP     Same as --include but uses REGEXP (regular expression)
                        instead of GLOB
  --rinclude-from=FILE  Read --rinclude REGEXPs from FILE
  --bucket-location=BUCKET_LOCATION
                        Datacentre to create bucket in. As of now the
                        datacenters are: US (default), EU, us-west-1, and ap-
                        southeast-1
  --reduced-redundancy, --rr
                        Store object with 'Reduced redundancy'. Lower per-GB
                        price. [put, cp, mv]
  --access-logging-target-prefix=LOG_TARGET_PREFIX
                        Target prefix for access logs (S3 URI) (for [cfmodify]
                        and [accesslog] commands)
  --no-access-logging   Disable access logging (for [cfmodify] and [accesslog]
                        commands)
  -m MIME/TYPE, --mime-type=MIME/TYPE
                        Default MIME-type to be set for objects stored.
  -M, --guess-mime-type
                        Guess MIME-type of files by their extension. Falls
                        back to default MIME-Type as specified by --mime-type
                        option
  --add-header=NAME:VALUE
                        Add a given HTTP header to the upload request. Can be
                        used multiple times. For instance set 'Expires' or
                        'Cache-Control' headers (or both) using this options
                        if you like.
  --encoding=ENCODING   Override autodetected terminal and filesystem encoding
                        (character set). Autodetected: UTF-8
  --verbatim            Use the S3 name as given on the command line. No pre-
                        processing, encoding, etc. Use with caution!
  --list-md5            Include MD5 sums in bucket listings (only for 'ls'
                        command).
  -H, --human-readable-sizes
                        Print sizes in human readable form (eg 1kB instead of
                        1234).
  --progress            Display progress meter (default on TTY).
  --no-progress         Don't display progress meter (default on non-TTY).
  --enable              Enable given CloudFront distribution (only for
                        [cfmodify] command)
  --disable             Enable given CloudFront distribution (only for
                        [cfmodify] command)
  --cf-add-cname=CNAME  Add given CNAME to a CloudFront distribution (only for
                        [cfcreate] and [cfmodify] commands)
  --cf-remove-cname=CNAME
                        Remove given CNAME from a CloudFront distribution
                        (only for [cfmodify] command)
  --cf-comment=COMMENT  Set COMMENT for a given CloudFront distribution (only
                        for [cfcreate] and [cfmodify] commands)
  --cf-default-root-object=DEFAULT_ROOT_OBJECT
                        Set the default root object to return when no object
                        is specified in the URL. Use a relative path, i.e.
                        default/index.html instead of /default/index.html or
                        s3://bucket/default/index.html (only for [cfcreate]
                        and [cfmodify] commands)
  -v, --verbose         Enable verbose output.
  -d, --debug           Enable debug output.
  --version             Show s3cmd version (1.0.1) and exit.
  -F, --follow-symlinks
                        Follow symbolic links as if they are regular files

Commands:
  Make bucket
      s3cmd mb s3://BUCKET
  Remove bucket
      s3cmd rb s3://BUCKET
  List objects or buckets
      s3cmd ls [s3://BUCKET[/PREFIX]]
  List all object in all buckets
      s3cmd la 
  Put file into bucket
      s3cmd put FILE [FILE...] s3://BUCKET[/PREFIX]
  Get file from bucket
      s3cmd get s3://BUCKET/OBJECT LOCAL_FILE
  Delete file from bucket
      s3cmd del s3://BUCKET/OBJECT
  Synchronize a directory tree to S3
      s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR
  Disk usage by buckets
      s3cmd du [s3://BUCKET[/PREFIX]]
  Get various information about Buckets or Files
      s3cmd info s3://BUCKET[/OBJECT]
  Copy object
      s3cmd cp s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
  Move object
      s3cmd mv s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
  Modify Access control list for Bucket or Files
      s3cmd setacl s3://BUCKET[/OBJECT]
  Enable/disable bucket access logging
      s3cmd accesslog s3://BUCKET
  Sign arbitrary string using the secret key
      s3cmd sign STRING-TO-SIGN
  Fix invalid file names in a bucket
      s3cmd fixbucket s3://BUCKET[/PREFIX]
  List CloudFront distribution points
      s3cmd cflist 
  Display CloudFront distribution point parameters
      s3cmd cfinfo [cf://DIST_ID]
  Create CloudFront distribution point
      s3cmd cfcreate s3://BUCKET
  Delete CloudFront distribution point
      s3cmd cfdelete cf://DIST_ID
  Change CloudFront distribution point parameters
      s3cmd cfmodify cf://DIST_ID

For more informations see the progect homepage:
http://s3tools.org

Consider a donation if you have found s3cmd useful:
http://s3tools.org/donate
まずは --configure で設定を行なって、その後 sync で同期すれば良さそうです

まずは s3cmd の設定ファイル作成です。設定ファイル名 ./kfwebsite.s3cfg に保存することにしました。
次のように入力すると対話形式で設定が開始します。
$ s3cmd --configure --config=./kfwebsite.s3cfg

Amazon S3 にアクセスするためのアクセスキーを聞かれるので入力します。
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
Access Key: XXXXXXXXXXXXXXXXXXXX
Secret Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

GPGを使って暗号化する場合のパスワードとGPGへのパスを聞かれますが、Webサイトのアップロードでは使わないのでそのまま return
Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: 
Path to GPG program: 

Amazon S3 にアクセスするための HTTPS を使うか?を聞かれます。Webサイトデータはそもそも公開情報なので HTTPS で保護する必要は無いのですが Yes にしておきます。
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't be used if you're behind a proxy
Use HTTPS protocol [No]: Yes

設定の概要が表示され、試しに接続してみるか聞かれるので Y と答えます。
New settings:
  Access Key: XXXXXXXXXXXXXXXXXXXX
  Secret Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  Encryption password: 
  Path to GPG program: None
  Use HTTPS protocol: True
  HTTP Proxy server name: 
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] Y

接続確認の結果が表示され、設定を保存するか聞かれるので y と答えます。
Please wait...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Not configured. Never mind.

Save settings? [y/N] y

無事設定が保存されました。
Configuration saved to './kfwebsite.s3cfg'

設定が出来たので次はWebサイトデータのアップロードです。
先ほど作成した設定ファイルを使って接続、ローカルのフォルダの内容と Amazon S3 の内容が同一になるようにします。
設定ファイルがカレントに、Webサイトデータがカレントにあるwebsiteフォルダとすると次のようなコマンドで同期できます。
(2013-08-07 追記:Macで余計なファイルがアップロードされてしまうため、--exclude オプションを追記しました)
$ s3cmd --config=./kfwebsite.s3cfg --delete-removed --exclude '.DS_Store' sync ./website/ s3://www.kfield.co.jp
(2013-08-07 追記:変更前は次のコマンドを掲載していました)
$ s3cmd --config=./kfwebsite.s3cfg --delete-removed sync ./website/ s3://www.kfield.co.jp

7. DNSの設定を変更する

Webサイトのデータはアップロードできたので、最後に www.kfield.co.jp が移行前のサーバではなく Amazon S3 を見るように変更します。

まずは Amazon S3 のアドレス
http://www.kfield.co.jp.s3-website-ap-northeast-1.amazonaws.com
が間違いなく表示できていることを確認します。

Webサイトに問題ないことを確認出来たら、DNS の設定を変更して
www.kfield.co.jp を www.kfield.co.jp.s3-website-ap-northeast-1.amazonaws.com の別名(CNAME)に変更すれば移行は完了です。

課題

さて、ここまでで一応 Webサイトは移行出来ました。
移行はできましたが、実は次のような課題が残っています。
  • s3cmd のオプション指定が不十分
    • .DS_Store などの余分なファイルまでアップロードされてしまう
    • ローカルにないファイルは削除するためログファイルが消されてしまう
  • Webサイトアップロード専用アカウントが必要
    • Webサイトのメンテを他のスタッフに委譲するにはそれだけが出来るユーザーを用意しておく必要が有る
これらの解決は次回以降に行います。

なお、同じ Bucket 内のログファイルも外から丸見えなのでは?と思いましたが見られないようになっているみたいです。

0 件のコメント :

コメントを投稿