EC2: GlusterFS in AWS
GlusterFS on AWSといえば、 #ヤマン のスライドですね。(後述)
こちらの記事では、実際の設定手順等が書かれてある。
GlusterFS in AWS | Celingest Blog – Feel the Cloud
---以下、拾い訳--
事前の考慮点
アベイラビリティゾーン(AZ)を跨いだ2台のサーバで ext4なEBSボリュームを複製する、といった検証(PoC)に入る前に、GlusterFSを使うべきではない場合を列挙した。
- 複数同時にシーケンシャルにファイル書き込みをする場合: ログのように複数のサーバから書き込まれる、というようにGlusterFSにログを保存する場合、ロック機構( locking system) が、深刻な問題を引き起こす可能性がある。理想的な解決方法は、ローカルのログに追記書き込みし、S3にアーカイブする方法。必要であれば、S3にログを保存する前か後に複数のサーバログを統合することも出来る。
- 継続的に変更されるファイル: PHPセッションファイルやキャッシュなどは、性能に影響する。セッションを統合管理したいのであれば、データベース( RDS, DynamoDB, SimpleDB)や memcached( ElastiCache) を使うべきで、GlusterFSのレプリケーション層に負担をかけることはない。アプリケーションのセッション保持の部分に手を入れられない場合、ローカルフォルダか共有メモリ( shm)を使い、 ELBの stickyセッションで振り分ければ、アプリケーションは透過的になる
- キャッシュ無しの複雑なPHP: アプリのコードをリポジトリに保存すれば、複数台のサーバに簡単にデプロイしてバージョンコントロールできる。GlusterFS上にコードを設置するのが避けられないなら、APCやXCacheといったキャッシュを使って stat()による性能劣化を避けるようにする必要がある。
インストール
Amazon LinuxのメインリポジトリにはGlusterFSパッケージがあるので、外部リポジトリを使う必要はない。各ノードで以下の手順でインストールできる。
yum install fuse fuse-libs glusterfs-server glusterfs-fuse nfs-utils chkconfig glusterd on chkconfig glusterfsd on chkconfig rpcbind on service glusterd start service rpcbind start
Fuseとnfsパッケージは GlusterFSのボリュームをマウントするために必要となる。我々は互換性のためNFSモードをオススメしている。
設定
EBSボリューム(エフェメラルストレージでも可)にPOSIXファイルシステム互換のext4パーティションを用意し、各ノードで以下を実行する。
mkfs.ext4 -m 1 -L gluster /dev/sdg echo -e "LABEL=gluster\t/export\text4\tnoatime\t0\t2" >> /etc/fstab mkdir /export mount /export
GlusterFSボリュームを作成するコマンドを実行するために、複数のノードから1台を選ぶ。インスタンス間の通信はフルアクセスであること。firewallや Security Groupの制限をなくしておく。
gluster peer probe $SERVIDOR2 gluster volume create webs replica 2 transport tcp $SERVIDOR1:/export $SERVIDOR2:/export gluster volume start webs gluster volume set webs auth.allow '*' gluster volume set webs performance.cache-size 256MB
$SERVER1と$SERVER2はインスタンスのDNS名に置き換える。
2つの非標準のオプションを設定する。1つめは、 auth.allowで、全てのIPからのアクセスを受け付けるようにしておく。替わりに、Security Groupでアクセス制御する。2つめは、 performance.cache-sizeで、性能向上のため キャッシュメモリの一部を使えるようにする。
mkdir -p /home/webs mount -t nfs -o _netdev,noatime,vers=3 localhost:/webs /home/webs # If we want to mount it automatically, we need to modify /etc/fstab echo -e "localhost:/webs\t/home/webs\tnfs\t_netdev,noatime,vers=3\t0\t0" >> /etc/fstab chkconfig netfs on
これで、 /home/webs にコンテンツを保存出来るようになった。保存したコンテンツは自動的にもう片方のインスタンスに複製される。stat() がGlusterFSのヘルスチェックを矯正するので、ls -l をフォルダで実行することで複製を強制実行できる。
--以下、 #ヤマン によるGlusterFS on AWSのスライド--
--
S3: バケットポリシーで特定のアカウントに対して参照可能にする
S3の利用方法としては静的Webサーバが便利で良く使われている。この場合、アクセス制御は基本的に全開にすることが多い。
一方、EMRの入出力で使用するバケットは、httpアクセスすることは少なく、特定のアカウントからのS3 APIでのアクセスのみ、というケースも多い。
例えば、以下の様にアカウントを跨いで、S3経由で非公開データ授受を行う場合などが考えられる。
S3のアクセス制御には、IAM、バケットポリシー、ACLがあるが、まずはバケットポリシーで設定してみる。
設定内容としては
・アカウント1111-2222-3333のS3バケット s3://understeer を、アカウント1234-5678-9012が閲覧出来るようにする
・閲覧方法は、 GetObject (各ファイルの取得・ダウンロード)および ListBucket (オブジェクト一覧表示)
とする
とはいえ、jsonフォーマットのポリシー定義をスクラッチで記述するのは大変なので、AWS Policy Generatorを使用する。
のように入力する。
・Principal : 権限付与するAWSアカウントID
・AWS Service: Amazon S3
・Actions: s3:GetObject
・ARN: arn:aws:s3:::understeer/*
とし、Add Statementを押下。続けて
・Principal : 権限付与するAWSアカウントID
・AWS Service: Amazon S3
・Actions: s3:ListBucket
・ARN: arn:aws:s3:::understeer
とし(ARNの末尾がバケット名で終わっていることに注意!)、AddStatementを押下。以下のようになるはず。
Statementが2つあるのは、GetObjectはバケット配下のオブジェクトに対する定義であり、ListBucketはバケットそのものに対する定義となるため。
ここで、 Generate Policyを押下すると、ポリシー定義したjson記述が表示されるので、コピーする。
ちなみに、上記設定で出力されるjsonは以下のようになる。
{ "Id": "Policy1364376133312", "Statement": [ { "Sid": "Stmt1364375260427", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::understeer/*", "Principal": { "AWS": [ "123456789012" ] } }, { "Sid": "Stmt1364375280089", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": "arn:aws:s3:::understeer", "Principal": { "AWS": [ "123456789012" ] } } ] }
あとは、S3の画面にて、バケットのプロパティを表示し Permissions-> Edit bucket policyで上記jsonを入力し saveする。
うまく設定が行われていれば、アカウント1234-5678-9012配下のCloudBerryや s3cmdから対象バケットの中身が閲覧のみ出来るようになるはず。
S3: S3のURL
S3のWebサイトホスティング機能にリダイレクト機能が加わった。
リダイレクトさせたいオブジェクトのメタデータとして、Website Redirect Locationを設定すればOK.
ただし、URLは、S3のAPI URL (endpoint)ではなく、Website endpointを指定しないとリダイレクトしない。
そもそも、S3を静的コンテンツのWebサーバとして使う場合は、上記のWebsite endpointを使え、ということが重要。
ほか、Virtual Hostingも見とけ、ということで。
Virtual Hosting of Buckets - Amazon Simple Storage Service
参考
月額10円~でレンタルサーバーをはじめる方法 | アマゾン ウェブ サービス(AWS)
月額10円〜 - Amazon S3でウェブサイトをホスティングする方法 - Amazon Web Services ブログ
S3: Amazon Linuxにs3cmdをインストールしてコマンドラインでS3を操作する
S3は、まずは Management ConsoleやCloud Berry Explorer、CyberDuckといったGUIツールから使うか、 AWS SDK for PHP, Java, Ruby, .NET といったAPI経由で使うことが多い。(参考:S3の関連ツール・ライブラリ等 - aws memo )
バックアップ処理など、cronなどでスクリプトから操作したい場合は、s3cmdが便利。
インストール
Amazon Linuxでデフォルト無効になっている epelリポジトリからインストール
$ sudo yum -y --enablerepo epel install s3cmd
もしくは、ここからyumのリポジトリファイルを取得して、/etc/yum.conf.d/にコピーした後にyum installする。
$ wget http://s3tools.org/repo/RHEL_6/s3tools.repo ~/ $ sudo cp s3tools.repo /etc/yum.conf.d/ $ sudo yum -y install s3cmd
設定
コンフィグウィザードを起動し ~/.s3cfg を作成。ウィザードで最低限必要なのは、Access KeyとSecret Key。残りはデフォルトのままリターンでOK。あとから .s3cfgを編集可能。
$ s3cmd --configure Access Key: xxxx Secret Key: xxxx
実行例
バケツ一覧
$ s3cmd ls
リージョンを指定してバケツ作成
$ s3cmd mb --bucket-location=ap-northeast-1 s3://<bucket_name>
バケツにアップロード
$ s3cmd put -r /path/to/files s3://<bucket_name> # --acl-public オプションをつけると、アップロードと同時にweb公開 $ s3cmd put --acl-public -r /path/to/files s3://<bucket_name>
バケツ内オブジェクトのパーミッションを変更しWeb公開
$ s3cmd setacl -r --acl-public s3://<bucket_name>
バケツの使用量確認
$ s3cmd du s3://<bucket_name>
バケツへの差分同期
$ s3cmd sync /path/to/source/dir s3://<bucket_name>/prefix $ s3cmd sync s3://<bucket_name>/prefix /path/to/source/dir
バケツ間のコピー
$ s3cmd cp s3://<source_bucket_name>/object s3://<dist_bucket_name>/
EMR: EMRで集計してiOSで可視化する手順
Using AWS Elastic MapReduce Results with Mobile BI Analytics | Architects Zone
EMRの解析結果を、Roambi Analyticsという iOS向け BI 可視化ツールのクラウドサービスに食わせて、そちらで見る手順。
Roambi は、無料のLite(CSV, Excel, html対応)、Pro (Google Docs, SFDC対応)、Enterprise( Oracle, SAP, BusinessObjects, SAS, MS, IBM Cognos対応)の3エディション。
====
EC2: PostgreSQLをS3にバックアップする
heroku/WAL-E という、HerokuがOSS化したPython製のツール。
バックアップ、およびWALをS3に保存(Push)したり、取得(fetch)したりするものらしい。
通常、EBSのスナップショットでフルバックアップを取得できても、次回のスナップショット取得までの期間のデータは復旧できない。WALをEBSに保持したままだと、EBSに障害があった場合、ロールフォワードできない。
意識してWALをS3に保存しておく必要があるが、いちいちスクリプト書くのが面倒な人には有用なはず。RDS(MySQL)でも、bin-logを5分ごとにflushし、bin-logのアーカイブをS3に保存しておくことで、 Point-in-time-Recovery (PITR)を実現している。
あとHerokuのノウハウが詰まっている、という意味でも有用かも。
READMEもしっかり書かれているのでまずは試してみないと。