AWS EC2メール送信制限にハマりそうになったので書く
AWSのEC2インスタンスから外部のメールサーバを使ってメール送信する機能を含むアプリを構築していたときの備忘録。
デプロイし終わって簡単に送信テストを行なって疎通OK、いざ本番移行前のテストでデータ作って送信しようとしてみたところ、
メールサーバとのコネクションタイムアウトで失敗する。
全滅するわけでなく、何回かに一回は成功。
telnetで直接会話してみるもタイムアウト、ときどき成功。
ググったら基本中の基本のようで...
EC2からメール送出するなら先に申請しておくんだ!!
http://il-all.blogspot.jp/2012/03/ec2.html
どうやらEC2インスタンスの外にSMTPサーバに対して数十回メール送信すると、制限がかかってしまうとのこと。
解決策は以下
- SMTPポート(25)をやめて、Submissionポート(587など)でメールを送信するようにする
- AWSサポートページからメール送出上限解除の申請を行う
- SES(SimpleEmailService)を使う
のいずれか。
スパムサーバ避けなんですね。
メール送出上限解除の申請は、通常1、2営業日かかるんだそう。作業が深夜だったこともあり、ビジネスサポートに泣きついて、
特急でやってもらいました。
でもよく考えてみたらSubmissionポートあければいいじゃん、ということで急遽qmailをメンテして事なきを得ました。
サポートに相談したところ、25番ポート以外は特に制限していないとのことでした。
OSX(Lion)で、VirtualDocumentRoot を設定したのでメモ
WEBアプリケーションを開発するとき、localhost:8080とかlocalhost:9000とかで頑張っていたんですが、
進行中の開発モノと、メンテナンス中のサイトを交互に作業してると、URLの切替が段々うざったくなってきたんで、
ホスト名だけですっきりブラウズ出来るようにしたくなってきました。
http://hoge.localhost とか http://fuga.localhost
をサーバの再起動なくブラウザでアクセスしたい、というのがゴール
参考にしたところ
http://d.hatena.ne.jp/y-kawaz/20110725/1311610727:VirtualDocumentRootを使って複数ドメインをスッキリ管理(Apache)
1.apacheの設定変更
1)httpd.confを編集。
httpd-vhosts.confを有効にするため、以下の行のコメントを外します。
> sudo vi /etc/apache2/httpd.conf
# Virtual hosts
Include /private/etc/apache2/extra/httpd-vhosts.conf
2)httpd-vhosts.confを編集。
既存のexampleはコメントアウトします。
>sudo vi /etc/apache2/extra/httpd.conf
#
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot "/usr/docs/dummy-host.example.com"
# ServerName dummy-host.example.com
# ServerAlias www.dummy-host.example.com
# ErrorLog "/private/var/log/apache2/dummy-host.example.com-error_log"
# CustomLog "/private/var/log/apache2/dummy-host.example.com-access_log" common
#
#
# ServerAdmin webmaster@dummy-host2.example.com
# DocumentRoot "/usr/docs/dummy-host2.example.com"
# ServerName dummy-host2.example.com
# ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
# CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common
#
で以下を追加して最終的に以下に
NameVirtualHost *:80
ServerName *
VirtualDocumentRoot "/Users/ksaka-ew/Vhosts/%0/htdocs"
Options All
AllowOverride All
Allow from all
3)apache再起動
>sudo apachectl restart
4)サイトに応じたディレクトリを作る
>mkdir -p /Users/ksaka-ew/Vhosts/hoge.localhost/htdocs
ディレクトリの配置場所はどこでもOKです。
hoge.localhostの部分はアクセスしたいホスト名を入れます。
2.ホスト名を引けるようにする
hoge.localhostを127.0.0.1で引きたい。
1)hostsに下記行書き加えてエントリを追加
>sudo /etc/hosts
2)DNSキャッシュをクリアしてhostsを読込み
>dscacheutil -flushcache
これで終わりです。
/Users/ksaka-ew/Vhosts/hoge.localhost/htdocsの下にindex.htmlを置くなどして
>curl hoge.localhost
とやるなり、ブラウザで http://hoge.localhost/index.html にアクセスしてみてください。
Magento Cafe Tokyo #3にいってきた(2012-03-17)
いつものごとくメモ漏れ、勘違いご容赦ください。
Magentoケーススタディ(フロントエンド・バックエンド編)
西 宏和氏 @hirokazu1225
- カテゴリを作ってもナビにでない
- ルートカテゴリとサブカテゴリを理解しよう
- 1つのショップに複数のルートカテゴリを登録できる
- 有効フラグ-Off、カテゴリに登録しないOnになってない?
- ルートカテゴリとサブカテゴリを理解しよう
- 商品を登録したのに表示されない
- 商品と在庫の関係を理解しよう
- 在庫フラグと在庫数は別
- 表示対象ー>検索、カテゴリ
- 有効フラグ-Offになってない?
- 商品と在庫の関係を理解しよう
- カテゴリに商品が出ない
- 商品とカテゴリ・サイトの関係を理解しよう
- 特にマルチサイトのとき
- 表示させるサイトの選択
- サイトのカテゴリ
- ※マルチサイトの場合、登録したサイトからしか会員ログインできない
- フロントから登録後管理画面から設定できない
- 税の設定がよくわからない
- 税区分と税率の関係を理解しよう
- BtoCの場合は内税とすべき。楽チン。税金が変わっても商品価格を変えるだけ
- BtoBの場合は会社ルールを考慮する必要あり。切り捨て、切り上げなどなど
- Magentoでやるのはややこしい
- 外国では品目や地域によって税率が異なることも多い
- 出荷する地域や購入者の地域で課税するのかなどなど
- 税区分と税率の関係を理解しよう
- デザインテーマの変え方がわからない
- テンプレートとスキンの関係を理解しよう
- デザイン
- default/blankを使う。JSやCSSが最小限の状態ー>これを変更するのが楽
- 設定ー>デザイン
- パッケージやテーマを変更する
- テンプレートとレイアウトは同じものを使うことが多い
- レイアウトのみ変更(カスタマイズ)するのも手
- 標準の動き。現在テーマにパーツがない場合、どこに戻るか設定する
- デザイン
- テンプレートとスキンの関係を理解しよう
| base/default | ←最後にはここを使う |
| default/default | ↑ここをみて |
| default/iphone | ←ここにないと |
-
-
- ※base/defaultをカスタマイズしているとバージョンアップしたときに巻き戻るなど
-
- Magento Connectが動かない
- サーバの環境と設定を再確認しよう
- →Webサーバ実行ユーザがファイルの書き込みできていいの?
- インストールに失敗することがある
- ローカルないしテストサーバでダウンロードしておき、ファイルアップロードする方法を推奨
- サーバの環境と設定を再確認しよう
-
- 手動でダウンロードするには。
- downloader/.cacheの下にダウンロードされる
- ただし、依存性がある場合は手動で修正する必要がある
- だめなら、ソース読め
- 配送料金表の登録方法がわからない
- 住所表示の変更方法がわからない
- 設定画面で変更可能
- 設定ー>顧客ー>顧客設定→住所表記テンプレートを書き換える
- エクステンションのインストールに失敗したらサイトが見れなくなった
- エクステンションインストールしたのに設定画面にアクセスできない
- 権限を保存しなおせばOK
- Basic認証をかけたら画像をアップできなくなった
- スマホだけで別のテーマで表示したい
- ウェブサイトストア ストアビューの住み替え
- 同一サイト=マルチストア
- マルチサイト=マルチストア(ドメインが変わってもOK、会員情報を完全にわけることができる)
Magentoケーススタディ(チューニング編)
株式会社フラッツCTO 天方氏
- 背景
- Magentoのパフォーマンスについての相談をうけた
- リリース基準を満たせず、何度かあったリリース期日にリリースできない状態が続いていた
- サイトの特徴
- SKU数 約4500
- 将来的には数十万件
- 検索条件の軸が非常に多い
- 商品に検索からはいる
- スループット要件があった(25Request/Sec以上)
- ハード構成
- サーバスペック
- パフォーマンス測定(改善前)
- 22-24req/sec(トップページ、商品検索、空ページ)
- abコマンドで測定
- >ab -n 1000 -c 100 http://example.com/
- 問題点
- request/secの目標値の25以上に届いていない
- ページの表示が遅い
- クエリキャッシュが効いての数字。効かないとさらに遅い
- DBマスタの設定を変更する
- my.cnf
key_buffer=512m ->16m
innodb_buffer_pool_size=768m->4G (DBスレーブは10GB)
など
- 結果
- ほとんど変わらない。。。
- 再調査
- Memcache設定
- app/etc/local.xmlに追加する
- Webサーバの一台にmemcacheを設定して他のWebサーバから共有した
- 結果
- 32-36req/sec(速くなった。要件クリア)
- (クエリキャッシュが効いている状態)
- 検索ページはクエリキャッシュが効く前
- 0.26req/sec
- ApacheSolrなど入れる必要あるかも
- 課題
- memcacheの冗長化
- 検索
- 検索クエリの最適化
- ApacheSolr組み込み
- 総合対策
- MagentoCE1.6へ変更(パフォーマンス向上する)
- MagentoEnterpriseEdition変更(劇的に向上する)
- 教訓
- セッションをDB管理する場合は、DBマスタのトランザクション性能に気をつける
- Magentoの標準は日本語検索弱い。日本語検索はApacheSolrを使うなど
- セッション情報の保存に、当初memcacheを使っていたが、ロードバランサでセッションが切れる問題があった
- →WEBサーバごとに独立したmemcacheを設定していた
Magentoケーススタディ(カスタマイズ編)
西 宏和氏 @hirokazu1225
- default/blankを複製してカスタマイズ
- 余計な装飾がない
- バージョンのあわないテーマを導入すると壊れることがある。
- アップデートすると問題が発生することがある
- エクステンションの競合
- rewriteは1回しかできない
- エクステンションAとエクステンションBが同じクラスを拡張している場合、どちらかしか使われない
- クラスの継承関係は自動で解決しない
- コードを読んで自力で調整
- インデックスが更新できない
- ゴミデータがどこかにある(外部キー張ってるのに)→データベースをみて解決するしか
- Magentoのシステムログをみて解決する
- インデックスが更新できないとURLが更新できない
- 「商品とカテゴリとURL書き換えインデックス」「EAVカテゴリストラクチャをflatstructureに変換したインデックス」でよく起きる
- →DBを見るか、プログラム追いかけるか
- 商品登録でエラーがでる
- カスタムオプション周りでエラーが出ることがある
- 下記あたりにゴミがある。
catalog_product_option
catalog_product_option_title
catalog_product_option_type_price
catalog_product_option_type_title
catalog_product_option_type_value
- バージョンを上げたいんだけど
- coreいじってないですか?
base/default
default/default
default/modern
default/blank
default/iphoneあたり
- いれてるエクステンションは最新ですか?
- 有料の場合は、買い直すなど
- 無料の場合は、バージョンアップに対応してないなど
- OK?じゃあテスト環境でテスト
- 2回目からはきっとスムーズにできるよ
QAコーナー
Q.osCommerceからの乗せ換えをしたいが、どのパッケージを選べばいいの?
- Magentoは、eBayの資本がはいって、コミュニティの窓口として位置づけられている。すぐに開発が停まることはない。
- ZenCartは、バージョンアップ停滞。中の人も現状で満足してる(?)
- EC-Cubeは箱をあけたらすぐ使える。小型店舗向け。ベトナムやUSに展開といっているが???? 今後もコアには手を入れない方針。再設計はちょっとありえない。多言語対応、ダウンロード販売は無理。
Q.材質や大きさなどと細かく入力して注文するフォームは可能?
- 数量を設定して掛け算するくらいならOK。
- ボリュームライセンスなどの値引きを細かく設定することはできない。
- 動的に価格計算するもの、ビジネスロジックが複雑なものはそもそもパッケージには向いてない
- http://www.youorder.com/みたいのがあり
Q.CMSとの連携エクステンションっていいのある?
JAWS-UG Summit2012にいってきた (2012-03-03)第二日目 その4
上司にAWS利用を承認させる3つの方法 (クラウドワークス 大石氏)
- 目的
- せっかく勉強会に来ているんだから、ネットや本で勉強できないことを知りたい!
- AWSを勉強しても、仕事で使わないと身につかない
- 上司が貼る典型的な3つのネガキャン
- セキュリティは?
- 事例は?
- コストは青天井なんでしょ?
- セキュリティ
- よくある誤解:クラウドってセキュリティが不安
- 一般的あシステムの脅威:
- 外部:攻撃者のアタック、データ漏洩(アクセス権の設定ミス)
- 内部:データの盗難
- 場所がわからない?
-
- 外部は利用者がアプリケーションと設定で防御
- 内部はAWSが防御
- 上司に逆質問
- 会社存続に、不可欠なものは?
- ...(書ききれなかった)
- 答え:お金
- なぜ大切なお金を銀行に預けるのか?
- セキュリティ
- 可用性
- 預けた支店が事故を起こしても口座情報は保持
- 利便性
- ATMカードでどこからでもアクセス
- クラウドも銀行と同じ
- セキュリティ
- データ盗難は80%が内部犯行。
- 可用性
- バックアップやフェイルオーバー
- 利便性
- インターネット越しにどこからでもアクセス
- セキュリティ
- 事例(日本赤十字社)
JAWS-UG Summit2012にいってきた (2012-03-03)第二日目 その3
RIAとクラウド (横田氏 classmethod代表取締役)
- 時間がないのでRIAの話はしませんw
- なぜUIとサーバ側をわけるのか?
- UI側:増え続けるクライアント、画面サイズに合わせた情報量
- ライフサイクルの違いをAPIで吸収
- サーバ側:データ構造やロジックの定義には時間がかかるが変化は少ない。応答スピードの対応が必要
- 良いレスポンスのために
- リクエスト数を減らす1
- リクエスト数を減らす2
- S3に静的ファイルを置くとき
- HTML/CSS/JSはgzip圧縮する
- 画像はExpires Cache-Controlを長めに設定
- S3とCloudFrontどっちに置く
- S3はストレージサービス。長期保存用
- 東京リージョンに置けばそこそこスピードが出るが高速にデータをダウンロードしたければCloudFront
- アクセス制限を付与したい場合は、S3
- 認証つきURLならCloudFront/S3
- CloudFrontのエッジロケーションが大阪にもできた
- ネットワーク遅延を解消するため高価が大きい
- CloudFrontはS3 Originヘッダを引き継ぐためキャッシュや圧縮が有効であれば引き継ぐ。コスト面のメリット大きい
- S3/CloudFrontへの配備
- 手作業はめんどくさい
- キャッシュ設定
- Gzip圧縮
- アップロード
- 公開設定
- アクセス制限
- ビルドツールの活用
- ant
- S3Cmd
- S3Sync
- リクエス数を減らす3
- ディスクIOを減らす1
- EC2とEBSはネットワークで接続されている
- インスタンスサイズが大きいと割り当てられるネットワーク帯域が太くなる(SmallよりLargeが太い)
- ネットワーク帯域をたくさん使ってしまうと応答が遅くなる
- EBSはディスクなのでIOが大量に発生すると遅くなる
- ログを大量に出力するとIOが大量発生
- サービス系は常にカイゼンのために本番系でもデバッグログを出力していることもよくある
- ディスクへの書き込みを減らす
- ログはログサーバ(Fluentd等)を利用
- ディスクアクセスを高速化したい場合
- 大きいEC2インスタンスを使う
- RAID0を組む
- 2つのEBSボリュームをマウント
- MdadmでRAID0化
- EBSを使わずにEphemeral Disk を使う(EC2のローカル)
- DBアクセスを減らす2
- とりあえず負荷を減らす
- リードレプリカを用いる
- 検索・更新を分ける
- シャーディングする
-
- DBへの問い合わせ回数を減らす
- キャッシュ機構を使う.ElasticCache
- データベースにRDBMSを使わない
- DynamoDB、SimpleDB
- 操作ログや履歴はファイルへ.S3の利用
- DBへの問い合わせ回数を減らす
JAWS-UG Summit2012にいってきた (2012-03-03)第二日目 その2
ここからはパターン実践編。仮想シナリオをもとにパターン適用していきます。
クラウドデザインパターン コンテンツ配信編 (Amazon 片山氏 @c9katayama)
- シナリオ
- 雲の写真を載せるブログサイト開始
- はじめは個人的に開始
- 動画や過去画像集も公開
- まさかの大人気
- まさかの海外展開
- ブログサイトの開始
- MovableTypeをEC2のインストール
- EIPでIPアドレスを振って、Route53でDNSレコードを管理
- スタティックパブリッシング(MTから静的コンテンツ作成)
- インスタンス1台で運用
- 動画・過去画像集を公開
- 課題
- サイズが大きく、ダウンロード負荷の高いコンテンツの配信
- EC2のスケールアップ・アウトが費用がかかる
- データ容量は未知数
- 課題
-
- そこで「WebStorageパターン」ですよ
- アクセス不可の高い動画や画像コンテンツをS3に逃すパターン
- S3のDNS名をCNAMEに登録して仕様
- S3のWEBサーバ機能を利用
- EC2を複数立てるより安価
- そこで「WebStorageパターン」ですよ
- まさかの大人気
- アクセス増加によりアクセスできない状況に
- EC2やELB導入は費用がかかる
- そこで「DirectHostingパターン」ですよ
- パターン適用
- MTで生成したファイルをすべてS3へ定期保存
- サイトのメインDNSをS3へ割り当て、訪問者はS3へ
- S3マウントのソリューション
- S3へデータコピーするOSSを利用する
- S3FSなど
- まさかの海外展開
- 課題
- 海外のマニアがサイト発見
- 海外の有名ニュースサイトへの掲載が決定
- 掲載までに海外の対応を行う
- 課題
-
- そこで「Cache Distributionパターン」ですよ
- ユーザに近い場所からの配信
- 世界各地のエッジサーバを利用し、オリジンサーバのコンテンツをキャッシング
- AmazonCloudFrontを利用
- そこで「Cache Distributionパターン」ですよ
-
- パターンの適用
- 3つのサブドメインを利用
- ブログコンテンツ(www)、動画・画像(data)、コンテンツ管理コメント投稿(mt)
- S3から配信するデータは、S3のファイルをCloudFrontへ展開
- メインコンテンツをS3+CloudFrontにしたので更新が遅い(最大1時間など)
- CloudFrontへの初回アクセスは遅い。更新後、バッチでクロールしておくなど
- パターンの適用
- 最終型
- コンテンツ=S3
- 画像・動画=CloudFront+S3
- Blog投稿=EC2
- 重要なのは、最初だけでなく周期的なカイゼン
クラウドデザインパターンEC編 (玉川氏)
- シナリオ
- 雲グッズ販売サイト開始
- ECサイトをとりあげ「可用性」「耐障害性」を高めるパターンを中心にQWSを使用した実装方法を解説
- FloatingIPパターン
- 課題
- 利用ソフトのバージョンアップが必要
- テスト環境でバージョンアップし、懸賞して、本番環境とのIPアドレス入れ替えを行う
- 解決
- EIPでサーバに静的IPを振って、切り替える。Route53を使えばDNSの伝播は一瞬
- Server Swappingパターン
- Multi-Serverパターン
- 課題:
- Webサーバが落ちてもシステム全体で稼働し続けるようにしたい
- Multi-Serverパターンを適用し、Webサーバを冗長化する
- 解決
- ロードバランサ(ELB)
- WEBサーバ(EC2)x2の冗長構造
- DBサーバ(RDS)
- の3層構造にする。
- 課題:
-
- パターンの適用
- DBデータをダンプする
- 作成したRDSのDBインスタンスにインポートする
- ECCudeのデータベースの接続情報をRDSに書き換える
- パターンの適用
-
-
- ヘルスチェックの設定
-
-
-
- ELB配下にEC2を追加
- 切り離しテストも可能
-
- DBReplicationパターンの適用
- 課題:
- DB部分のSPOF(単一障害点)を解消したい
- 対応
- RDSでマルチAZを設定。障害時に自動でスタンバイサーバのレプリカDBに切り替わる
- 課題:
- Multi-Datacenterパターンの適用
- 課題
- サーバレベルだけでなくデータセンタレベルの障害にも対応できるようにする
- 対応
- ロードバランサ以下のレイヤをマルチリージョンで設定する。
- EC2から異なるリージョンのRDSへ接続は可能(遅延はある3-5ms)
- 課題
- 最終型
- ELB(ロードバランサ)
- (異なるリージョン)のAZ(AbilityZone)にEC2-RDSを2台配置
- RDSはMultiAZとして、一台をスタンバイとし、2台のEC2はメインサーバに接続する
- その他適用可能なパターン
- Multi-Region
- DeepHelthCheck
デザインパターン キャンペーンサイト編(鈴木氏 cloudpack(iret社) @suz_lab)
- CloneServerパターン
- サーバのクローン
- 現状のシステムを変更することなく容易にスケールアウト
- マスタEC2がSPOF
- ファイルアップロードなどはマスタで
-
- マスタのAMIをEC2に展開。
- ファイルはマスタにアップし、rsyncで定期的にスレーブに同期
- マスタのAMIをEC2に展開。
- ScaleOutパターン
- NFS Sharingパターン
- NFSReplicaパターン
- 残る課題はDBがボトルネック
- Read Replicaパターン
- 読み取り専用のDBを作成
- 頻度の高い読み込みの複製
- DBの読み取りクエリの負荷分散
- データ解析用途で利用することも可能
- 非同期レプリケーションになることを注意
- 課題:アクセスは静的コンテンツがほとんどだった!
- URLRewritingパターン
- 静的コンテンツの退避
- 静的コンテンツのアクセスをS3/CF(CloudFront)に
- mod_ext_filterやNginxでURLの書き換え(WEBサーバ側で静的コンテンツのURLを書き換えてS3へ振る)
- CloudFrontの場合は、コンテンツがキャッシュ