Amazon Glacierって御存知ですか?
Amazon Web Servicesの一ストレージサービスで、1Gを1ヶ月1円で使えるのです!
データのバックアップ用途に使えるストレージです。
Amazon Glacierでは保存する場所のことをVaultといい、
保存するファイルのことをArchiveと言います。
Archiveにはアップロード時にユニークなID=ArchiveIdが振られます。
Archiveを取り出したり、削除したりするときにはArchiveIdが必要になります。
Archiveは、基本的には利用者側で控えて置かなければなりません。
で、ここで今日のお題です。
Glacierに保存したArchiveのIDを忘れてしまったり、紛失したりした時にどうするか、です。
実は私も、Glacierの試用中にArchiveIDを忘れてしまい、アップロードしたファイルを消せなくなってしまいました。
激安とはいえ、不要なファイルのためにお金を取られ続けるのは悲しいですよね。
上記の様に、Archiveは基本的には利用者側で控えておくべきものですが、
Amazonにも保存されています。
それを取り出す方法は、↓のURLに記載されている、AmazonGlacierDownloadInventoryWithSQSPollingを実行することです。
http://docs.amazonwebservices.com/amazonglacier/latest/dev/retrieving-vault-inventory-java.html
実行すると、JSONフォーマットのファイルがローカルに出力され、その中にアップロードしたArchiveのIdが記載されています。ただ、結果を得る(JSONファイルがローカルに出力される)ために4時間ぐらい待つ必要があります。。。
ArchiveIdはしっかりと控えておくほうが無難ですね。
バックアップって、テープに取ろうにも、オートローダやテープ媒体は結構高いし、
ハードディスクはちょっと不安だし、ブルーレイも容量少ないし。。。で、コレまでは悩みが多いものでした。
Amazon Glacierはそのソリューションになり得ると思います。
Amazon Glacierは中小企業やWebサービス運営のバックアップにとても有用です。
しかしながら、ちょっとクセがあります。
何かお困りごとがあれば、コメントいただければお力になります。
(宣伝みたいになっちゃったけれど、私はAmazonとは何の関係もありません。。。)
2012年9月7日金曜日
2012年9月1日土曜日
関数型言語っぽい言語
突然ですが、問題です。
↓は、ある言語の一部です。
さて、何言語でしょう?
JavaScriptと答えてくれたあなたを僕は大好きです。
で、答えはJavaでした。無理やりJavaScriptっぽく書いています。
全文は以下です。ちゃんと1秒後に「3」って表示されます!
「だから何」って。。。別になんでもなんですが。。。。
↓は、ある言語の一部です。
さて、何言語でしょう?
{
var myFunction = new function() {
var execute()
{
i = 1;
j = 2;
console.log(i + j);
return null;
}
};
setTimeout(myFunction, 1000);
}
JavaScriptと答えてくれたあなたを僕は大好きです。
で、答えはJavaでした。無理やりJavaScriptっぽく書いています。
全文は以下です。ちゃんと1秒後に「3」って表示されます!
public class FakeJavaScriptTimeout {
class var {
var execute(){return new var();}
}
class function extends var {
public int i, j;
}
static class console {
static void log(Object o) {
System.out.println(o);
}
}
public void setTimeout(final var function, final int time) {
new Thread(){
public void run() {
try {
Thread.sleep(time);
} catch (InterruptedException e) {}
function.execute();
};
}.start();
}
{
var myFunction = new function() {
var execute()
{
i = 1;
j = 2;
console.log(i + j);
return null;
}
};
setTimeout(myFunction, 1000);
}
public static void main(String[] args) {
new FakeJavaScriptTimeout();
}
}
「だから何」って。。。別になんでもなんですが。。。。
自己署名証明書(別名:オレオレ証明書。もしくは適当証明書)でHttpsUrlConnectionを使ってSSL通信する方法。
Javaでは、
new URL(ENDPOINT).openConnection()で、ENDPOINTに「https://」プロトコルを指定すると、サーバとSSL通信ができます。
SSL通信するためには、サーバ証明書が必要なんですが、買おうとするととても高い。(無料でSSL証明書がつくれるサービスもありますが、ちょっと手間。)
なので、開発時においては、keytoolなどを利用して自分で証明書を作成したり、サーバデフォルトのSSL証明書を使ったりします。
その際、証明書が正式なものでないため、証明書認証でExceptionが発生しちゃいます。以下のようなException。
とか、
java.io.IOException: HTTPS hostname wrong: should be
本投稿ではそれの対処方法をご紹介します。
証明書で無視する項目は以下の2つです。
1.証明書が信用できるかをチェックしないようにする。
2.証明書とサーバのホスト名がマッチしているかチェックしないようにする。
では、以下、実装方法です。
1.HttpsURLConnection.setSSLSocketFactoryに、証明書を確認しないようにした
new URL(ENDPOINT).openConnection()で、ENDPOINTに「https://」プロトコルを指定すると、サーバとSSL通信ができます。
SSL通信するためには、サーバ証明書が必要なんですが、買おうとするととても高い。(無料でSSL証明書がつくれるサービスもありますが、ちょっと手間。)
なので、開発時においては、keytoolなどを利用して自分で証明書を作成したり、サーバデフォルトのSSL証明書を使ったりします。
その際、証明書が正式なものでないため、証明書認証でExceptionが発生しちゃいます。以下のようなException。
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
とか、
java.io.IOException: HTTPS hostname wrong: should be
本投稿ではそれの対処方法をご紹介します。
証明書で無視する項目は以下の2つです。
1.証明書が信用できるかをチェックしないようにする。
2.証明書とサーバのホスト名がマッチしているかチェックしないようにする。
では、以下、実装方法です。
SSLSocketFactoryを渡します。
2.HttpsURLConnection.setHostnameVerifierにサーバをチェックしないようなX509TrustManagerを渡します。
例えば、以下のようなソースです。 public static String doGET() throws Exception {
HttpsURLConnection connection = (HttpsURLConnection) new URL("https://google.com").openConnection();
connection.setSSLSocketFactory(createNoCheckSSLFactory());
connection.setHostnameVerifier(new NoCheckHostnameVerifier());
int responseCode = connection.getResponseCode();
if (200 != responseCode) {
String errorMessage = streamToString(connection.getErrorStream());
throw new IOException("status = " + responseCode + ", message = " + errorMessage);
}
return streamToString(connection.getInputStream());
}
private static SSLSocketFactory createNoCheckSSLFactory() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[] { new NoCheckX509TrustManager() };
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
return sc.getSocketFactory();
}
private static class NoCheckX509TrustManager implements X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {}
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}
private static class NoCheckHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
登録:
コメント (Atom)