AWS CloudFormation 用の ActionScript API

挑戦状が来たので早速30分ぐらいで作りました。

こんなかんじで書けます。


var cfm:CFM = new CFM(CFM.US_EAST_1);
cfm.setAWSCredentials(AWSKey.key,AWSKey.sec);
cfm.addEventListener(AWSEvent.RESULT,awsHandler);
cfm.executeRequest(CFM.DESCRIBE_STACKS);


ActionScript API for AWS (Amazon Web Services)
https://github.com/satoshi7/ActionScript-API-for-AWS-Amazon-Web-Services-

Amazon Web Services のセキュリティについて

Amazon Web Services のセキュリティについて、自分用のメモ書きです。ちょっとだけ加筆しました。

  • DoD 5220.22-M(国立産業セキュリティプログラム作業マニュアル)準拠の廃棄処理
  • AWS セキュリティプロセス抜粋
    • 認証と認定:SAS70
      • セキュリティ設計の原則:公式設計レビュー、脅威モデリング、リスク査定の遂行、静的コード分析、侵入テスト
      • 物理的セキュリティ:2要素認証を最低2回、定期的に監査、綿密な身元調査
      • バックアップ:冗長化のため自動的に複数の物理的ロケーションでに保存、スナップショット
      • ネットワークセキュリティ:分散サービス妨害(DDoS)攻撃、中間者 (MITM) 攻撃、IP スプーフィング、ポートスキャニング、第三者によるパケットスニッフィング
    • 複数のセキュリティレベル
      • ホストオペレーティングシステム:多要素認証
      • ゲストオペレーティングシステム:証明書ベースのSSHv2 を使用
      • ファイヤウォール:強制インバウンドファイヤウォールは、デフォルトでは拒否モードに設定
      • ハイパーバイザー:ゲストOS はCPU に対して高度なアクセスをもちません。
      • インスタンスの分離:物理的RAM も分離しています。
      • 障害分離:インスタンスを複数のアベイラビリティゾーン(Availability Zone) だけでなく、複数の地理的に離れたリージョン(Region)に配置できる柔軟性を提供。各アベイラビリティゾーンは、障害分離が可能なようデザインされています。つまり、個々のアベイラビリティゾーンは、一般的な都市地域内で物理的に分離されており、地震や洪水での影響が同時に及ばないような場所が考慮されています。個別の無停電電源装置UPS)やオンサイトのバックアップ生成施設に加え、さらにシングルポイントの障害の可能性を減らすために、別々の電力供給施設から異なる配管網を経由して、個別に電力供給を行なっています。これらはすべて、冗長的に、複数のTier-1 プロバイダに接続されています。
  • ・補足資料
  • クラウドとは
    • ユーザーが、クラウドのサービス提供者側の人間を介することなく、必要に応じてサービスの利用を開始したり設定を変更したりできること。
      • 機能がネットワーク経由で提供され、標準的な仕組みを使って多様なクライアント・プラットフォームからアクセスできること。
      • サービス提供者の計算資源が複数のユーザーに対してマルチテナント・モデルによって提供されるように確保されており、顧客のニーズに従って物理的・仮想的な資源が動的に割り当てられること。
      • 機能が迅速かつ柔軟に提供され、ユーザーが必要に応じて使用する計算資源の量を動的に増減させることができること。
      • クラウドの利用状況を監視・制御して計算資源の利用を最適化し、当該利用者とサービス提供者に報告すること。

AWS API の認証の種類について

ここでミニLTです。

AWSが提供しているQueryAPIを解析していますと、認証周りで違いがあることが分かります。そこで、まとめます。

  • 0:HTTPヘッダで認証する方法その1
    • 暗号化アルゴリズム:HMACSHA1
    • 使われているサービス:S3
    • 認証生成に使う文字:Date,Resources,HTTP-Verbなどなど
  • 1:EC2等で使われていたがdepricatedになった認証方法
  • 2:GETパラメータで認証する最もメジャーな認証方法
    • 暗号化アルゴリズム:HMACSHA1
    • 使われているサービス:EC2, CloudWatch, Import Export, Auto Scaling, Elastic Beanstalk, Elastic Load Balancing, Elastic MapReduce, Identity and Access Management, Relational Database Service, SimpleDB, Simple Notification Service,Simple Queue Service, Virtual Private Cloud
    • 認証生成に使う文字:Action,SignatureVersion,SignatureMethod,AWSAccessKeyId,Timestampなどなど

  

  • 3:HTTPヘッダで認証する方法その2
    • 暗号化アルゴリズム:HMACSHA256
    • 使われているサービス:Route 53, Simple Email Service
    • 認証生成に使う文字:Date
  • 4:HTTPヘッダで認証する方法その3
    • 暗号化アルゴリズム:HMACSHA1
    • 使われているサービス:CloudFront
    • 認証生成に使う文字:Date


詳しくはこちらをお試しください。

https://github.com/satoshi7/ActionScript-API-for-AWS-Amazon-Web-Services-


以下のAPIと接続確認ができています。


次新しいのが出たら即日対応してやるっ!!!(挑戦状)


ではでは。

ActionScript API for Amazon Simple Email Service

とりあえず作ってみた。

GitHubに上げました。

とりあえず、、、動きますw。

以前とSignatureが変わっててちょっとだけ苦労しました。


ActionScript API for AWS (Amazon Web Services)
https://github.com/satoshi7/ActionScript-API-for-AWS-Amazon-Web-Services-

AWS Elastic Beanstalk を使う その9

TomcatRails動きました。
jruby-rack.jarのバージョンが問題だったみたい。
1.0.5 から 1.0.3 に下げたらうまくいけました。
これでrailsアプリからTomcat用のwarファイル生成OKですー。

>gem uninstall jruby-rack
>gem install jruby-rack -v 1.0.3
>sudo warble config
>sudo warble

アドレス部分をご覧ください。

しかーし、生成されたwarファイルが大きすぎてアップロードできないし。。

って、Management Console から Upload New Version って指定したら怒られたのに、Environment の Action から Deploy a Different Version ってやったらアップロードできた!

そして、Beanstalk で Ruby on Rails の動作環境が整いました〜。

オレオレHerokuだねー。

AWS Elastic Beanstalk を使う その10

では続きまして Beanstalk で PHP を動かしましょう。

これもwarblerと同じようにphpアプリをwar化して配備します。

RubyJavaプラットフォーム上で動かすためにJRubyを用いましたが、
今度は、PHPJavaプラットフォーム上で動かすためにQuercusを用います。

Quercusサイトのリンクからwarファイルをダウンロードして展開します。
いつもの hello.php を記述しましょう。

<?php
  phpinfo();
?>

この結果が以下です。

そして、Beanstalkに載せました。


Quercus
http://quercus.caucho.com/

AWS Elastic Beanstalk を使う その11

色々環境が揃ってきたので、Tomcat の Session Persistence を拡張しようと思った感じですw。

まずはじめに Tomcat のソースをダウンロードしてEclipseにインポートしてビルドに必要なライブラリを追加します。

次に参考にするStoreクラスのソースを見ます。
FileStoreとJDBCStoreが参考になりますね。

んじゃ、これを参考に SimpleDBStoreを作りましょう。

FileStore と JDBCStore は StoreBase抽象クラスを継承してStoreインタフェースを実装しています。同じようにクラス定義します。

雛形はこんな感じかな。

package jp.cm.aws.tomcat.session;

import java.io.IOException;

import org.apache.catalina.Session;
import org.apache.catalina.Store;
import org.apache.catalina.session.StandardSession;
import org.apache.catalina.session.StoreBase;

public class SimpleDBStore extends StoreBase implements Store{
	
	@Override
	public int getSize() throws IOException {
		return 1;
	}

	@Override
	public String[] keys() throws IOException {
		String[] ks = {"keykeykey"};
		return ks; 
	}

	@Override
	public Session load(String id) throws ClassNotFoundException, IOException {
		System.out.println("load");
		StandardSession session =
            (StandardSession) manager.createEmptySession();
		return session;
	}

	@Override
	public void remove(String id) throws IOException {
		System.out.println("remove");
	}

	@Override
	public void clear() throws IOException {
		System.out.println("clear");
	}

	@Override
	public void save(Session session) throws IOException {
		System.out.println("save");
	}

}

後はここにSessionの永続化と復元の処理を入れればOKのはず。

続きまして、上記の雛形がちゃんと動くか確認します。

アプリケーションフォルダの下にMETA-INFフォルダを作ってcontext.xmlを作ります。中身はこんな感じ。

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="${catalina.home}/webapps/simpledb"
    path="/simpledb"
    reloadable="true"
    source="org.eclipse.jst.j2ee.server:test"
    backgroundProcessorDelay="1" >
  <Manager className="org.apache.catalina.session.PersistentManager"
      distributable="true"
      duplicates="0"
      saveOnRestart="true"
      maxActive="0"
      maxActiveSessions="0"
      minIdleSwap="0"
      maxIdleSwap="0"
      maxIdleBackup="0"
      maxInactiveInterval="0" 
      sessionCounter="0" >
      
     <Store className="jp.cm.aws.tomcat.session.SimpleDBStore"/> 
     
     <!--
    <Store className="org.apache.catalina.session.FileStore"
	 directory="${catalina.home}/logs/sessions" >
	</Store>
     -->
	
    <!--
    <Store className="org.apache.catalina.session.JDBCStore"
        checkInterval="1"
        connectionURL="jdbc:mysql://mydb.csnpjudtgu1o.us-east-1.rds.amazonaws.com:3306/awstest"
        driverName="com.mysql.jdbc.Driver"
        sessionAppCol="app_name"
        sessionDataCol="session_data"
        sessionIdCol="session_id"
        sessionLastAccessedCol="last_access"
        sessionMaxInactiveCol="max_inactive"
        sessionTable="tomcat_sessions"
        sessionValidCol="valid_session" />
    -->
  </Manager>
</Context>

このままだとSimpleDBStoreクラスが見つからないと怒られるので、
TOMCAT_HOME/libにクラスをコピーして置きます。jar化してもOK。

さて、無事にSession Persistenceをしてくれるカスタムクラスの作成に成功しました〜。

ちゃんと動いているか確認してみましょう。

このアプリにひとつjspを作って以下のようにセッションに書き込みをしてみます。

session.setAttribute("key1","value1");

このjspをブラウザから叩くと、以下のようにTomcatのログが出ました!!

2011/01/23 22:27:44 org.apache.catalina.session.PersistentManagerBase swapIn

あとは、SimpleDBにセッション情報を書き込む処理だけですね。

これは、AWS SDK for Java をダウンロードしてlibにjarを追加してごにょごにょすればすぐにできるはず。

今日はここまで。