aws memo

AWS関連の備忘録 (※本ブログの内容は個人的見解であり、所属組織及び企業の意見を代弁するものではありません。1年以上古いエントリは疑ってかかってください)

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経由で非公開データ授受を行う場合などが考えられる。

f:id:understeer:20130327180231p:plain

S3のアクセス制御には、IAM、バケットポリシーACLがあるが、まずはバケットポリシーで設定してみる。

設定内容としては

・アカウント1111-2222-3333のS3バケット  s3://understeer を、アカウント1234-5678-9012が閲覧出来るようにする

・閲覧方法は、 GetObject  (各ファイルの取得・ダウンロード)および ListBucket (オブジェクト一覧表示)

とする

とはいえ、jsonフォーマットのポリシー定義をスクラッチで記述するのは大変なので、AWS Policy Generatorを使用する。

f:id:understeer:20130327181039p:plain

のように入力する。

・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を押下。以下のようになるはず。

f:id:understeer:20130327181459p:plain

 

 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"
        ]
      }
    }
  ]
}

f:id:understeer:20130327181450p:plain

 

あとは、S3の画面にて、バケットのプロパティを表示し Permissions-> Edit bucket policyで上記jsonを入力し saveする。

f:id:understeer:20130327181915p:plain

うまく設定が行われていれば、アカウント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: Windowsからマウントして使う

いろいろあるので取り敢えず列挙。(そのうち感想を追記するかも)

TntDrive

Gradinet

Eugrid

気になるのは、NTFSとかちゃんと出来るのか、オフライン時の挙動はどうなるのか?などなど。

 

てことで、本格的に使うなら、S3対応NASとかStorage Gatewayとかを使え、ってことになりそう。

S3: Amazon Linuxにs3cmdをインストールしてコマンドラインでS3を操作する

S3は、まずは Management ConsoleやCloud Berry ExplorerCyberDuckといった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もしっかり書かれているのでまずは試してみないと。