2012年8月26日日曜日

Amazon ELB からのみアクセスを許可する Security Group の設定

ELB の配下に設置しているインスタンスは、セキュリティを考慮すると ELB からのみアクセスを許可するようにしたいですね(管理用のアクセスは別として)。

ELB に用意されている特別な Security Group を使って、これを実現できます。

まず最初に ELB の API Tools を使用して、Source Security Group の名前を確認します。
$ elb-describe-lbs [LoadBalancerName] --show-long --headers
... ,"{owner-alias=example-elb,group-name=example-elb-sg}", ...
次に ELB 配下のインスタンスが所属する Security Group に、確認した名前を設定します。
$ ec2-authorize [group_name] -u example-elb -o example-elb-sg
もし、より制限の低いルールが設定されていた場合は、そのルールを削除します。
(以下の例は、tcp 80番へのアクセスを全て許可するルールが設定されていた場合)
$ ec2-revoke [group_name] -P tcp -p 80 -s 0.0.0.0/0

2012年8月5日日曜日

boto を使って Amazon S3 へのアップロード

boto を使って S3 へアップロードする時、東京リージョンなど、US Standard 以外のリージョンのバケットへのアップロードが失敗するという事象に遭遇しました。エラー内容は Broken pipe 。
>>> from boto.s3.connection import S3Connection
>>> conn = S3Connection()
>>> bucket = conn.get_bucket('mybucket')
>>> k = Key(bucket)
>>> k.set_contents_from_filename('myfile')
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
...
    857             raise BotoServerError(response.status, response.reason, body)
    858         elif e:
--> 859             raise e
    860         else:
    861             msg = 'Please report this exception as a Boto Issue!'

error: [Errno 32] Broken pipe
しかも、50KBぐらいのファイルだと問題ないのに、500KBくらいになるとダメ。東京リージョンのサーバから実行してるから、US の方が距離的に遠いし、時間がかかってタイムアウトとは考えにくい。しかも、500KBってそんなに大きいサイズではないし。 

同じ事象で困っている人がいて、以下のページが参考になりました。

 broken pipe error, non US-Standard region

解決方法としては、Connection を作成する時に、host を指定すること。
>>> from boto.s3.connection import S3Connection
>>> conn = S3Connection(host='s3-ap-northeast-1.amazonaws.com')

指定するエンドポイントは、ここから参照できます。

Amazon Web Services Glossary - Regions and Endpoints