Amazon ElasticBeanstalkインスタンスをNewRelicでモニタリングする
NewRelicのServersデータ収集用のデーモンをインストールします。
プログラミング言語とか関係なく「.ebextensions」に設定ファイルを置くだけ。
Node.jsでもJavaでも同じ設定ファイルが使えます。
configファイルを作成
設定ファイルの書き方とか置き方とかは前回と同様です。
「.ebextensions」配下にインストール用の「newrelic.config」を配置します。
Install and start newrelic daemon on Amazon ElasticBeanstalk
あとはデータが収集されるので管理画面から確認します。
参考: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と同じ階層のファイルを全選択して圧縮します。
失敗した場合は「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
metricNameSpaceとcloudwatchRegionは必要に応じて変更してください。
しばらく待つとCloudWatchの"Custom Metrics"にデータが収集されファイルディスクリプタ/メモリ使用量/スレッド数などが観測できるようになります。
細かい設定などは以下の記事などを参考にしてください。
Metric Configuration in AWS SDK for Java - AWS Developer Blog - Java
Chromeの「Secure Shell」を使用してAmazonEC2に接続する
Secure ShellはChromeから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接続します。
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ポートを有効にしてブラウザからアクセスします。
設定変更
デフォルトだとユーザ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.
再起動したらエラーメッセージが消えているので変更したID/パスワードでログイン
実際に使うときはホスト名指定してSSL証明書を入れる必要があると思いますが、
とりあえず使えそうです。