2012年1月4日

ASP.NETのセキュリティパッチ適用でエラー「Operation is not valid...」が発生する場合の対処

年末にこの記事を読んで、早速WindowsのWebサーバーにパッチを適用しておいた。
ASP.NET Security Update Shipping Thursday, Dec 29th - ScottGu's Blog

対処されている脆弱性の詳細な説明はこちら。
徳丸浩の日記: Webアプリケーションに対する広範なDoS攻撃手法(hashdos)の影響と対策


ところが今日になってある業務アプリケーションで「エラーが起きる」との連絡があった。

エラーの内容は、


Operation is not valid due to the current state of the object
「The URL-encoded form data is not valid.」

というもの。

いろいろテストして見ると、どうやら年末に適用したセキュリティパッチが原因らしい。

ASP.NET MS11-100: how can I change the limit on the maximum number of posted form values? - Stack Overflow

An ASP.NET request that has lots of form keys, files, or JSON payload fails with an exception and returns a 500 HTTP status code

上のページに解決方法が書かれていたので、何とかエラーは解消した。

web.config の appSettings セクション内に次の設定を追加すれば良い。
    <!-- Post Backで処理可能な最大フィールド数(Defaultは1000) -->
    <add key="aspnet:MaxHttpCollectionKeys" value="5000"/>

設定する値が大きくなるほどPostBackで処理出来るフィールド数に余裕が出来る。

でも、増やしすぎるとセキュリティパッチの意味が無くなるのであまり良くないと思う。


そもそも1000以上ものフィールドをPostBackする様な画面を作るのがおかしい。

とは思うけれども、とりあえず以前動いていたものは動く様にしないと行けないので、当面はこれで回避するしかなさそうだ。

ちなみにエラーが起きたページは、GridViewの各行の中にCheckboxやDropdownが複数配置されていて、ボタンが押された時にグリッド内の全行に対して何らかの処理をするという作りになっていた。それで大体250行以上表示している場合に1000フィールドの制限に引っかかっていた模様。

もちろんページングして一度に表示される行数を少なくしておけば問題は起きないのだけれど、「1トランザクションで全データを対象に処理する」という要件があったためにあえてページングしない様になっていたらしい。

ASP.NETだと一つのFormタグの中に全部の画面要素が入るので、何も考えずに一昔前のVBの延長的な感覚で作ってしまうとすぐにこんな事になってしまう、という良くない例だ。

でも、クライアント・サーバー型システムから移植した様な業務アプリケーションでこういうケースって、実際には結構あるんだろうなあ。











2011年12月29日

Amazon S3で保存期間を過ぎると自動削除する設定が可能になった

朝起きるとAmazonからお知らせのメールが届いていた。
Today we're excited to announce Object Expiration, a new feature to help you efficiently manage data stored in Amazon S3. Object Expiration enables you to schedule the removal of objects after a defined time period.

You can define Object Expiration rules for a set of objects in your bucket. Each expiration rule allows you to specify a prefix and an expiration period in days.  (...)

(以下意訳)
「Object Expiration」機能のお知らせです! Amazon S3に保存されたデータを効果的に管理する事を可能にする新機能です。これによって一定期間が過ぎるとオブジェクトが削除される様にスケジュールする事が出来ます。

お客様のBucket内の任意のオブジェクトのセットに対してObject Expirationルールを設定して頂けます。それぞれのルールにはプリフィックスと保存期間(日数)を指定する事が出来ます。(...)


早速AWSの管理コンソールを開いて確認してみた。

Bucketのプロパティを表示して、「Lifecylcle」というタブを開くと、ルール名、プリフィックス、保存期間の組み合わせを複数設定出来る様になっている。


プリフィックスに「foldername/」という様に指定すればフォルダ単位で保存期間を設定出来る。

 これは便利! 

これで自前でバックアップのローテーション機能を作り込まなくても大丈夫になりそうだ。

というかちょうど先週「ローテーション機能付きS3バックアップツール for .NET」を作った所だったのだけど。。。








2011年12月23日

VB.NETでAmazon EC2のEBSスナップショットを自動化する

Amazon EC2のEBSスナップショットをWindows環境で自動化する必要に迫られた。

スナップショットを取るだけならEC2のコマンドラインツールですぐに出来るけれども、際限なくスナップショットが増えてしまうのは困る。

そこで古いスナップショットを自動で削除しつつ新しいスナップショットを作成してくれるツールが必要になる。

Rubyスクリプトはいくつか見つけた。
code.rock: Amazon EBSとRightAwsを使って自動バックアップ環境を構築する

実践で使えるEBSスナップショット取得スクリプト - よかろうもん!

EBSのスナップショットを定期的に作成するスクリプト - こせきの技術日記

oko_changのインフラ日誌: EBSボリュームのスナップショットを自動作成する(right_aws)

シェルスクリプトもあった。
Amazon EBSのスナップショット(バックアップ)を取得しつつ世代管理も行うスクリプト - RX-7乗りの適当な日々

Pythonスクリプトもあった。
AmazonEC2/S3の便利スクリプトのまとめ | スターワン::ブログ


でもそれだけのためにRubyやPythonをインストールしたり、Cygwinをセットアップしたりするのはちょっと避けたかった。


クラウド管理用のWebサービスも試して見た。

RightScaleCloudWorks など。

RightScaleはUIが複雑過ぎて断念。CloudWorksは無料版だと世代管理は出来なさそう。


要件を満たすものがなかなか見つからないので、結局 AWS SDK for .NET を使って自分で作ってみる事にした。
Ec2EbsSnap - GitHub

実行可能ファイルはこちら (.NET Framework 3.5以上が必要)