Amazon ElasticBeanstalkインスタンスをNewRelicでモニタリングする

NewRelicのServersデータ収集用のデーモンをインストールします。
プログラミング言語とか関係なく「.ebextensions」に設定ファイルを置くだけ。
Node.jsでもJavaでも同じ設定ファイルが使えます。

configファイルを作成

設定ファイルの書き方とか置き方とかは前回と同様です。
「.ebextensions」配下にインストール用の「newrelic.config」を配置します。

Install and start newrelic daemon on Amazon ElasticBeanstalk

あとはデータが収集されるので管理画面から確認します。

f:id:yustam:20140409142133p:plain

参考:Installation: RedHat and CentOS - New Relic Documentation

Node.js on ElasticBeanstalkインスタンス上にキャッシュ用のRedisを設置する

前回に続きBeanstalkネタですがBeanstalkでは構成管理ツールのような起動時に環境の初期化を行う機能が備わっています。
EC2 インスタンス上のソフトウェアのカスタマイズ - AWS Elastic Beanstalk

Node.jsのアプリケーションをホスティングするだけでなくRedisをインストールしてみました。

サンプルアプリケーションの入手

こちらからダウンロードします。展開すると以下の様な構成になっているので、

nodejs-sample/
 ├─ app.js
 ├─ index.html
 ├─ package.json
 └─ .ebextensions/
       └─ logging.config

configファイルを作成

「.ebextensions」配下にRedisインストール用の「redis.config」を配置します。

Install Redis on Elastic Beanstalk

設定はインスタンスタイプなど合わせて変更します。

アプリケーションの配備

コマンドラインツールもありますがそのままzip圧縮して配備することも出来ます。
Windowsの場合はフォルダを選択して圧縮するとapp.jsが見つからずに起動に失敗が
してしまうのでapp.jsと同じ階層のファイルを全選択して圧縮します。

f:id:yustam:20140219144509p:plain

失敗した場合は「Logs」から「Snapshot Logs」を確認します。

Tomcat on ElasticBeanstalkへCloudWatchカスタムメトリクスを簡単に追加する

今までEC2でゴリゴリ作っていたのですが最近ElasticBeanstalkの便利さに気付き始めました。
初期の頃に少しだけ触って初心者向けの機能だと今まで侮っていたのですがEclipseプラグインも発達してサクサク開発できるので楽しいです。

ElasticBeanstalkでJava Webアプリケーションを構築する場合はTomcatを使用する事になりますが、デフォルトではCloudWatchに正常/異常のチェックしかできません。 EC2のメトリクスではメモリ使用量が見れないしカスタムメトリクスって面倒くさいという方に以下の設定がオススメです。

ManagementConsoleからアプリケーションの設定で"JVM command line options"が設定できるので以下の文字列を設定します。

-Dcom.amazonaws.sdk.enableDefaultMetrics
 =metricNameSpace=MyBeanstalkApp,
  includePerHostMetrics,
  cloudwatchRegion=ap-northeast-1

metricNameSpacecloudwatchRegionは必要に応じて変更してください。
しばらく待つとCloudWatchの"Custom Metrics"にデータが収集されファイルディスクリプタ/メモリ使用量/スレッド数などが観測できるようになります。

細かい設定などは以下の記事などを参考にしてください。
Metric Configuration in AWS SDK for Java - AWS Developer Blog - Java

Chromeの「Secure Shell」を使用してAmazonEC2に接続する

Secure ShellChromeからSSHするアプリ。
Windowsの開発環境では普段TeraTermを使用しているのですが、
接続先も保存できて便利そうなので試しに使ってみました。

公開鍵を作成

EC2に接続する際に使用する秘密鍵から公開鍵を生成します。

>ssh-keygen -y -f keyname.pem > keyname.pub

秘密鍵の名前を変更

Secure Shellに鍵を登録する際は「xxxxx」「xxxxx.pub」という名前で
セットにしないと正しく登録されないので名前を変更します。

>cp keyname.pem keyname

Secure Shellで接続

「Import...」から上で作成した「keyname」「keyname.pub」を選択し
「Identity」に「keyname」が表示されればOK。SSH接続します。

f:id:yustam:20130917103548p:plain

f:id:yustam:20130917103555p:plain

DynamoDB Localをaws-java-sdkから操作

ダウンロードと起動

Additional Tools and Libraries For Amazon DynamoDB - Amazon DynamoDB
ここまでは公式ドキュメントに載ってる通り。

$ java –Djava.library.path=. -jar DynamoDBLocal.jar

aws-java-sdkから呼び出す

基本的にエンドポイントを"http://localhost:8000"にするだけ。
アクセスキーとリージョンはDBファイル名に使われるので好きな名前で。
以下で動かすと"AccessKey_us-east-1.db"という名前のファイルが作成された

public static void main(String[] args) {
    String accessKey = "AccessKey";
    String secretAccessKey = "SecretKey";
    AWSCredentials cre = new BasicAWSCredentials(accessKey, secretAccessKey);
    AmazonDynamoDBClient client = new AmazonDynamoDBClient(cre);
    client.setEndpoint("http://localhost:8000");
}

動作確認

String tableName = "DynamoTest";

// テーブル一覧
System.out.println(client.listTables());

// テーブル作成
List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();
keySchema.add(new KeySchemaElement().withAttributeName("HogeId").withKeyType(KeyType.HASH));
AttributeDefinition attrDef = new AttributeDefinition().withAttributeName("HogeId").withAttributeType(ScalarAttributeType.S);
ProvisionedThroughput pt = new ProvisionedThroughput().withReadCapacityUnits(10L).withWriteCapacityUnits(5L);
System.out.println(client.createTable(new CreateTableRequest(tableName, keySchema).withAttributeDefinitions(attrDef).withProvisionedThroughput(pt)));

// アイテム追加
Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("HogeId", new AttributeValue("AAAA"));
item.put("foo", new AttributeValue("valueA"));
item.put("bar", new AttributeValue().withSS(Arrays.asList("valueB", "valueC")));
System.out.println(client.putItem(new PutItemRequest(tableName, item)));

// アイテム取得
Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
key.put("HogeId", new AttributeValue("AAAA"));
System.out.println(client.getItem(new GetItemRequest(tableName, key)));

// アイテム更新
Map<String, AttributeValueUpdate> attributes = new HashMap<String, AttributeValueUpdate>();
attributes.put("bar", new AttributeValueUpdate(new AttributeValue().withS("valueD"), AttributeAction.PUT));
System.out.println(client.updateItem(new UpdateItemRequest(tableName, key, attributes)));

// スキャン
System.out.println(client.scan(new ScanRequest(tableName)));

// アイテム削除
System.out.println(client.deleteItem(new DeleteItemRequest(tableName, key)));

// テーブル削除
System.out.println(client.deleteTable(new DeleteTableRequest(tableName)));

実行結果

{TableNames: [],}
{TableDescription: {AttributeDefinitions: [{AttributeName: HogeId,AttributeType: S}],TableName: DynamoTest,KeySchema: [{AttributeName: HogeId,KeyType: HASH}],TableStatus: ACTIVE,CreationDateTime: Fri Sep 13 14:12:03 JST 2013,ProvisionedThroughput: {NumberOfDecreasesToday: 0,ReadCapacityUnits: 10,WriteCapacityUnits: 5},TableSizeBytes: 0,ItemCount: 0,}}
{}
{Item: {HogeId={S: AAAA,}, foo={S: valueA,}, bar={SS: [valueB, valueC],}},}
{}
{Items: [{HogeId={S: AAAA,}, foo={S: valueA,}, bar={S: valueD,}}],Count: 1,ScannedCount: 1,}
{}
{TableDescription: {AttributeDefinitions: [{AttributeName: HogeId,AttributeType: S}],TableName: DynamoTest,KeySchema: [{AttributeName: HogeId,KeyType: HASH}],TableStatus: ACTIVE,CreationDateTime: Fri Sep 13 14:12:03 JST 2013,ProvisionedThroughput: {NumberOfDecreasesToday: 0,ReadCapacityUnits: 10,WriteCapacityUnits: 5},TableSizeBytes: 0,ItemCount: 0,}}

Amazon Elastic Transcorderメモ

今のところ使う予定は無いのですが試しに使って見ました。
思ったより変換速度が早くかなり良いサービスだと思います。
ジョブの設定が少しわかりづらかったので使い方をメモ。

パイプライン作成

S3にテスト用のバケットを1つ作成してInput及びOutputに同じバケットを設定しました。
ここは特に難しくないため割愛します。

ジョブ作成

出力の設定が複数あって分かりづらかったのでいろいろ試行錯誤しました。
以下に設定項目と設定例を示します。

設定名 設定例 説明
Pipeline pipeline-test 作成したパイプライン名
Input Key input/test.m4v 変換対象のファイル。バケット名を除くパスを設定
Output Key Prefix output/test- すべての出力ファイルの接頭辞。"/"が必須

存在しないファイルを指定するなど設定を誤ると実行時にエラーとなります。
ジョブがエラーで終了するのですが原因を確認する方法がないようなので注意です。

設定名 設定例 説明
Preset System preset : Web 変換後の出力形式を選択。Presetから選択。
Output Key video/test.mp4 変換後の出力ファイルのキー。"/"も使用可
Create Thumbnails Yes サムネイルを出力するか(Yes or No)
Thumbnail Filename Pattern thumb/web-{count} サムネイル出力ファイルのキー。"/"も使用可

出力先のフォルダ構成

上の設定例でジョブを実行した場合には以下の出力となります。

bucket/input test.mp4
bucket/output/test-video test.mp4
bucket/output/test-thumb web-00001.png
bucket/output/test-thumb web-00002.png
bucket/output/test-thumb web-00003.png
bucket/output/test-thumb web-00004.png

Watermark機能

動画にJPEGまたはPNG画像を被せる機能があるので試してみました。
使い方は簡単で上記の設定のあとWatermarkを有効にして同じバケット内にある
Watermark用の画像を選択するだけです。(バケット名は含めない)

設定名 設定例
Input Key for Preset Watermark Id BottomRight watermark/test.png

大きめの画像を指定してみたのですがかなり小さめに出ました。
サイズの指定は出来ないみたいです。

AmazonLinux + GlassFish4 OpenSource版インストールメモ

基本的にこちらの手順に沿ってインストールします。

JDK7ののインストール

Java SE Downloadsのページから。ここでは「jdk-7u25-linux-x64.rpm」を選択します。

$ wget http://download.oracle.com/otn-pub/java/jdk/7u25-b15/jdk-7u25-linux-x64.rpm?AuthParam=1371954590_3d03cab91de40b402e438ee42549fbf7
$ mv jdk-7u25-linux-x64.rpm\?AuthParam\=1371954590_3d03cab91de40b402e438ee42549fbf7 jdk-7u25-linux-x64.rpm
$ sudo rpm -ivh jdk-7u25-linux-x64.rpm

GlassFish4のインストール/起動

GlassFish Server - Download Pageこちらのリンクから「glassfish-4.0-ml.zip」を選択します。

$ wget http://download.java.net/glassfish/4.0/release/glassfish-4.0-ml.zip
$ unzip glassfish-4.0-ml.zip
$ ./glassfish4/bin/asadmin start-domain
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/glassfish/admin/cli/AsadminMain : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: org.glassfish.admin.cli.AsadminMain. Program will exit.

AmazonLinuxにOpenJDKが入っているのでエラーになったようです。1.7.0に変更します。(参考)

sudo update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_25/bin/java 17025
sudo update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.7.0_25/bin/javac 17025

もう一回トライ

$ ./glassfish4/bin/asadmin start-domain
Waiting for domain1 to start ...................................
Successfully started the domain : domain1
domain  Location: /home/ec2-user/glassfish4/glassfish/domains/domain1
Log File: /home/ec2-user/glassfish4/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.

起動しました。

ブラウザから確認

4848ポートを有効にしてブラウザからアクセスします。

f:id:yustam:20130623121120p:plain

設定変更

デフォルトだとユーザIDが「admin」パスワードが空なので変更します。

$ ./glassfish4/bin/asadmin change-admin-password
Enter admin user name [default: admin]>admin
Enter the admin password>
Enter the new admin password>
Enter the new admin password again>
Command change-admin-password executed successfully.

「Secure Admin must be enabled to access the DAS remotely.」が出ていたので設定を変更します。

$ ./glassfish4/bin/asadmin --host [EC2パブリックDNS] enable-secure-admin
Enter admin user name>  admin
Enter admin password for user "admin">
You must restart all running servers for the change in secure admin to take effect.
Command enable-secure-admin executed successfully.

再起動します。

$ ./glassfish4/bin/asadmin stop-domain
Waiting for the domain to stop .
Command stop-domain executed successfully.n executed successfully.
$ ./glassfish4/bin/asadmin start-domain
Waiting for domain1 to start ...............................
Successfully started the domain : domain1
domain  Location: /home/ec2-user/glassfish4/glassfish/domains/domain1
Log File: /home/ec2-user/glassfish4/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.

f:id:yustam:20130623125425p:plain

再起動したらエラーメッセージが消えているので変更したID/パスワードでログイン

f:id:yustam:20130623130025p:plain

実際に使うときはホスト名指定してSSL証明書を入れる必要があると思いますが、
とりあえず使えそうです。