[Streaming] KafkaワークロードのOracle Cloud Streamingへの移行/Migrate Your Kafka Workloads To Oracle Cloud Streaming

原文はこちら

あるホスティング環境から別の環境へのアプリケーションとワークロードの移行はともするとたいへんな道のりになります。過去15年のあいだ、わたしは何度もなんとか移行をしなければならないことがあり、それらは完全に平易なものでも楽しいものでもありませんでした。そこでは避けがたく予期していなかった問題が生じ、時には単純なアップグレードですら終わりなき頭痛を引き起こすこともありました。なので、Oracle Cloudへアプリケーションを移行しなければならない開発者、そしてDevOpsエンジニアのみなさんには同情します。同時に、アプリケーションをOracle Cloudへ移行することによって得られる利益はいつだって不利益を上回るとも考えています。このような移行の労苦については多くの検討が内部でなされており、数あるツール、また、プロセスをより簡単で苦労を少なくするためのちょっとした「ワザ」が開発されています。このポストではそうした「ワザ」のうちひとつについてお話します。

Kafkaは疑いなくデータストリーミング(とその他)でポピュラーで、それは性能がよく、信頼でき、利用を容易にするためのSDK実装がいくつもあるからです。あなたのアプリケーションもすでにKafkaを利用しているかもしれません。おそらくあなたはあるマイクロサービスでメッセージをProduceし、他のマイクロサービスでConsumeしているかも。ではなぜこのような目的のために、KafkaではなくOracle Streaming Service(OSS)を使うことを検討するべきなのでしょうか?わたしの経験上、ZookeeperとKafkaクラスターをホストするためのインフラを構築し、保守するのは大変な苦労(とコスト)を伴い、したがってあなたは深い知識と構成管理のための余分な時間が必要になります。その代わりに、すぐに使い出せるホステッド環境を提供するOSSのようなサービスを活用することで、そうした時間(とコストの一部)が不要になります。このブログポストでは、あなたのアプリケーションでKafka SDK for Javaを使うことでOSSをかんたんに使えるということをご説明していきます。このKafka互換機能は現状ではLimited Availabilityでの提供となっていますが、遠くないうちにGAとなる予定です。

Streamの構成

まず初めに、このデモのためにちゃちゃっとStreamトピックを構成しちゃいましょう。Oracle Cloudのダッシュボードコンソールから、'Analytics' -> 'Streaming'と選択します。
Streamのリストページで、'Create Stream'をクリック(必要に応じてこのStreamを配置するのに適切なコンパートメントを左のサイドバーから選択しておいてください)。
Create Streamダイアログで、Streamの名前をつけ、Retentionの値(あるメッセージがトピックから破棄されるまでの時間)を入力します。
希望のパーティション数を入力して、'Create Stream'をクリック。
新しいStreamの詳細ページに直接遷移し、おおよそ30秒でStreamの状態がActiveと表示されるでしょう。

Streams Userの作成

次にやるのはStreamingサービス専用のユーザーの作成です。コンソールサイドバーメニューからIdentity配下のUsersをクリック。
'Create User'をクリックして出てくるダイアログを埋めます。
新しいユーザーが作成されたら、ユーザー詳細ページに行ってAuth Tokenを生成します。
Tokenをコピーしてしっかり保存しておきましょう。このGenerate Tokenダイアログをいったん離れると取得することはできません。Identityコンソールにいるはずなので、サイドバーからCompartmentsをクリックしてStreamを作成したコンパートメントを見つけてください。そのコンパートメントのOCISをコピーし、これもあとで使うので保存しておいてください。
さて、ここからグループを作成し、先ほど作成したユーザーをこのグループに追加し、グループポリシーを作成します。
ここまでAuth Tokenを持ち、Streamを利用できるグループに所属したユーザーが用意できました。やったぜ。また、コンパートメントのOCIDも控えてあるので、コードに進んでいく準備ができています。

Kafka Producerの作成

ここまででKafka Client SDKを使ってこのStreamを利用するコードへと進む準備ができました。わたしたちのプロジェクトでの最初のステップはClient SDKの依存するライブラリが存在することの確認です。わたしはGradleを使っていますが、あなたが他のものを使っているのであれば適切に修正してください。
plugins {
    id 'java'
    id 'application'
}
group 'codes.recursive'
version '0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
    mavenCentral()
}
application {
    mainClassName = 'codes.recursive.KafkaProducerExample'
}
dependencies {
    compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.3.0'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
tasks.withType(JavaExec) {
    systemProperties System.properties
}
view rawbuild.gradle hosted with ❤ by GitHub
ここでわたしはProducerをテストするために以下のような小さなJavaプログラムを使います。
package codes.recursive;
public class KafkaProducerExample {
public static void main(String... args) throws Exception {
System.out.println("producer");
CompatibleProducer producer = new CompatibleProducer();
producer.produce();
}
}
CompatibleProducer クラスをビルドする前に、事前に取得しておいた必要な認証情報をIDEのRun/Debug設定に入れ込んでおきます。
べつにひどく複雑ってわけではないんですが、でもそれぞれの要素がわかりやすくなるように、ここで一度にはCompatibleProducer クラスだけをビルドすることにしましょう。まず、認証情報のための変数をいくつか宣言し、アプリケーションに渡す環境変数から値をセットするようにしておきます。
public class CompatibleProducer {
    public void produce() {
        String authToken = System.getenv("AUTH_TOKEN");
        String tenancyName = System.getenv("TENANCY_NAME");
        String username = System.getenv("STREAMING_USERNAME");
        String compartmentId = System.getenv("COMPARTMENT_ID");
        String topicName = System.getenv("TOPIC_NAME");
     }
}
次に、 KafkaProducerを構成するために使ういくつかのプロパティを作成します。これらはKafka SDKを使ってOSSのStreamにアクセスするために必要になるプロパティです。
:Streamingトピックを作成したリージョンに合わせて、"bootstrap.servers"のリージョンの値を変更する必要がある場合があります。
Properties properties = new Properties();
properties.put("bootstrap.servers", "streaming.us-phoenix-1.oci.oraclecloud.com:9092");
properties.put("security.protocol", "SASL_SSL");
properties.put("sasl.mechanism", "PLAIN");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put("sasl.jaas.config",
                "org.apache.kafka.common.security.plain.PlainLoginModule required username=\""
                + tenancyName + "/"
                + username + "/"
                + compartmentId + "\" "
                + "password=\""
                + authToken + "\";"
);
properties.put("retries", 5); // retries on transient errors and load balancing disconnection
properties.put("max.request.size", 1024 * 1024); // limit request size to 1MB
最後に、 KafkaProducer を構成してプロパティを入れ込み、5つの「test」メッセージをトピックにProduceしましょう。
KafkaProducer producer = new KafkaProducer<>(properties);
for (int i = 0; i < 5; i++) {
    ProducerRecord<String, String> record = new ProducerRecord<>(topicName, UUID.randomUUID().toString(), "Test record #" + i);
    producer.send(record, (md, ex) -> {
        if( ex != null ) {
            ex.printStackTrace();
        }
        else {
            System.out.println(
                    "Sent msg to "
                            + md.partition()
                            + " with offset "
                            + md.offset()
                            + " at "
                            + md.timestamp()
            );
        }
    });
}
producer.flush();
producer.close();
System.out.println("produced 5 messages");
あなたのIDEでこのプログラムを実行すると、以下のような出力が得られるでしょう。
> Task :producer:run
producer
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Sent msg to 0 with offset 57 at 1570626362254
Sent msg to 0 with offset 58 at 1570626362254
Sent msg to 0 with offset 59 at 1570626362254
Sent msg to 0 with offset 60 at 1570626362254
Sent msg to 0 with offset 61 at 1570626362254
produced 5 messages
BUILD SUCCESSFUL in 8s
2 actionable tasks: 2 executed
09:06:01: Task execution finished 'run'.
Disconnected from the target VM, address: '127.0.0.1:59701', transport: 'socket'
view rawoutput.sh hosted with ❤ by GitHub
ここでStreamingコンソールをちょっと見て、5つのメッセージがProduceされて表示されていることを確認してみましょう。
次に、Kafka互換のConsumerを作成してこれらのProduceされたメッセージをConsumeします。

Kafka Consumerの作成

Consumer作成のステップのうち大部分はProducer作成のためのステップと同様です(Gradleの依存ライブラリ、Run設定の環境変数、など)。なのでここでは CompatibleConsumer クラス自体にフォーカスしたいと思います。何かしら見逃しがあるんじゃないかと心配でも逃げ出さないでくださいね、このブログポストのコード全部がGitHubで見られます。わたしたちの互換Consumerを作成していきましょう!
The consumer starts out similarly - declaring the credentials, setting some properties (which do differ slightly from the producer, so beware!) and creating the Consumer itself:
Consumerは同じように作っていきます。認証情報を宣言し、プロパティを設定(Producer用のとはちょっと異なるので注意してくださいね!)し、 Consumer 自体を作成します。
:Procuderのときと同様、Streamingトピックを作成したリージョンに合わせて、"bootstrap.servers"のリージョンの値を変更する必要がある場合があります。
String authToken = System.getenv("AUTH_TOKEN");
String tenancyName = System.getenv("TENANCY_NAME");
String username = System.getenv("STREAMING_USERNAME");
String compartmentId = System.getenv("COMPARTMENT_ID");
String topicName = System.getenv("TOPIC_NAME");
Properties properties = new Properties();
properties.put("bootstrap.servers", "streaming.us-phoenix-1.oci.oraclecloud.com:9092");
properties.put("security.protocol", "SASL_SSL");
properties.put("sasl.mechanism", "PLAIN");
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "group-0");
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.put("sasl.jaas.config",
        "org.apache.kafka.common.security.plain.PlainLoginModule required username=\""
                + tenancyName + "/"
                + username + "/"
                + compartmentId + "\" "
                + "password=\""
                + authToken + "\";"
);
properties.put("max.partition.fetch.bytes", 1024 * 1024); // limit request size to 1MB per partition
Consumer<Long, String> consumer = new KafkaConsumer<>(properties);
ここで、作成しておいたトピックへのSubscriptionを構成し、1秒毎に新規メッセージをポーリングさせます。
try {
    consumer.subscribe(Collections.singletonList( topicName ) );
    while(true) {
        Duration duration = Duration.ofMillis(1000);
        ConsumerRecords<Long, String> consumerRecords = consumer.poll(duration);
        consumerRecords.forEach(record -> {
            System.out.println("Record Key " + record.key());
            System.out.println("Record value " + record.value());
            System.out.println("Record partition " + record.partition());
            System.out.println("Record offset " + record.offset());
        });
        // commits the offset of record to broker.
        consumer.commitAsync();
    }
}
catch(WakeupException e) {
    // do nothing, shutting down...
}
finally {
    System.out.println("closing consumer");
    consumer.close();
}
最後のステップはこのConsumerサンプルを実行した上でProducerに火を入れて、このConsumerが新しくProduceされたメッセージをConsumeするのを観察することです。
> Task :consumer:run
consumer
org.apache.kafka.common.security.plain.PlainLoginModule required username="toddrsharp/streaming-user/ocid1.compartment.oc1..aaaaaaaa7lzppsdxt6j56zhpvy6u5gyrenwyc2e2h4fak5ydvv6kt7anizbq" password="M0}tf)R<eCumKcgic6mC";
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Record Key 92a078df-89bd-4c55-a40b-668509f5d543
Record value Test record #0
Record partition 0
Record offset 62
Record Key ba12e804-49b0-49cc-ac6f-c45dc52bf543
Record value Test record #1
Record partition 0
Record offset 63
Record Key 29883f60-5fb1-4c94-a23f-5a489f109d82
Record value Test record #2
Record partition 0
Record offset 64
Record Key 00af0e12-a92f-4162-b2a6-22cdcf04fd73
Record value Test record #3
Record partition 0
Record offset 65
Record Key dd69776a-1bfd-419a-b6b0-7445c098b20e
Record value Test record #4
Record partition 0
Record offset 66
<=========----> 75% EXECUTING [35s]
view rawconsumer_output.sh hosted with ❤ by GitHub
はい、というわけで、あなたはKafka SDK for Javaを使ってOracle Streaming ServiceトピックとメッセージをProduce、Consumeできました。
Hey! このブログポストのコードはGitHubで見られるます: https://github.com/recursivecodes/oss-kafka-compatible-streaming

[Cloud] 無料クラウドへの旅路―AWSからOCIへの移行/Journey To The Free Cloud - Migrating From AWS To OCI

原文はこちら

われわれは先週Oracle OpenWorldで画期的なお知らせ、すなわち、Oracle Cloudでの完全Free Tierサービスを発表しました。わたしはTwitterでの批判も読みましたし、あなたもまた懐疑的であるというのもわかってますよ。本当にタダのものなんてない、ですよね?でもこのFree Tierは本当なんです。1ヶ月限りでもなければ、1年限りでもありません。ずっと、です。この「Always Free」Tierで提供するサービスの中にはAutonomous Databaseが含まれており、それぞれ1 OCPUと20GBストレージを持ったふたつのインスタンスを使うことができます。これで何ができるかって?たくさんのことができます。近くこれについてブログを書いていくので見逃さないでくださいね。また、それぞれ1/8 OCPUと1GBメモリを備えたふたつのVMも使えます。これらは超高速ってわけではないですけど、信じてください、ある種のアプリケーションには十分なんです。このアイディアについてもそのうちブログに書くつもりです。さらに、トータルで100GBのBlock Storage、10GBのObject Storage、および10GBのArchive Storageといったストレージ、そして1インスタンス、10Mbps帯域のロードバランサーも使えます。他に含まれているのはモニタリング、通知、Eメール配信です。実際のところこれらを利用しない手はないので、もっと詳しく知って、今日登録してしまいましょう。はい、確認のためにクレジットカード情報を登録いただく必要があるんです。いいえ、同意なしにはなんらの課金も発生しません。最近わたしはいくつか他のクラウドプロバイダーの無料サービスに登録したんですが、クレジットカード情報なしに登録させてくれたところはなかったように思います。

ハンズオン

わたしはOracle Cloudの(マーケティングやセールスではなく)デベロッパー・アドボケイトなので、このFree Tierについてまず自分自身で触ってみて、これがやってみる価値があり、他の開発者たちも有用だと感じるだろう、と信じられるようになってからではないとブログに書くことはできません。というわけでわたしは個人用アカウントを登録し、個人ブログをAmazon Web ServicesからOracle CloudのFree Tierに移行してみることにしました。わたしはOracleに加わる前から個人ブログを数年に渡りAWSを使ってホストしてきていまして、それをOracle Cloudに移行する機会がないままだったんですよね。なのでこれはFree Tierを試してみるのにうってつけのプロジェクトだったというわけです。わたしの個人ブログはとても平易なアプリケーションで、データベースとしてはAmazon RDS上のMySQLを使っており、ブログウェアにはカスタムGrailsアプリケーションをApache Tomecat上のWARファイルを、画像ホスティングにはS3を、そしてAmazon SESをEメール配信に使っています。というわけで移行プランは以下のような感じになりました:
  • MySQL RDSからAutonomous DBへのデータベース移行
  • S3からOCI Object Storageへの画像移行
  • SESとOCI email deliveryを交換
  • OCI VMへアプリケーションをデプロイ
The first step was obviously signing up for my free account and launching my new DB instance and VM. I've blogged about the sign up process and launching your first free Autonomous DB instance before, so check that out if you need help.
ひとつめのステップでは無料アカウントに登録して新規DBインスタンスとVMを構築することになります。これについてはすでに登録プロセスと無料のAutonomous DBインスタンスを作成する手順をブログに書いておいたので、必要であれば参照してください。

データベース移行

データベースの移行は移行をガイドしてくれるウィザードがあるSQL Developerを使えば平易で苦労もありません。ただしひとつコツがあって、それはとても寛大なパーミッションを持ったユーザーを使って移行をやることです。そのため、移行を試みる前にこのドキュメントに目を通しておいてください。でも正直言ってドキュメントを全部読む気なんてありませんよね?そんな気はないってわかってます。でも少なくとも移行ユーザーに必要になるパーミッションがなにかを説明するこの章だけは読んでおいてくださいね。
データの移行が済んだら、MySQLではなくOracle DBのアカウントを使うようにするために、Grailsアプリケーションにちょっとした変更を加える必要がありました。Hibernate Dialectや、自動インクリメントKeyではなくシーケンスを使うようにするといった設定変更です。でも特殊なことは何もありません、アプリケーションのバックエンドを変えるときにはいつだってちょっとした調整をしなきゃならないということは想定してますよね。

S3からのオブジェクトの移行

これは比較的容易でした。というのも、わたしはおおよそ100くらいの画像だけしか移行する必要がなかったので、単にS3から手動でダウンロードしてOracle CloudのObject Storageにアップロードしました。もっと複雑な移行になる可能性もありますから、必要であれば このホワイトペーパーをチェックしてください。オブジェクトが配置できたのち、わたしはSQL UPDATEクエリを実行してブログポスト内の既存リンクをOCI Object Storageへのリンクへと置換しました。最後に、新しくアップロードした際にAWSのバケットではなくObject Storageに格納されるよう、S3からOracle Cloudに向き先を変えるようコードを修正する必要がありました。わたしのGrailsアプリケーションはAWS SDKをGrailsプラグイン経由で利用しており、きっとこれをOCI SDKに交換することもできたはずです。でも、OCI Object StorageがAWS SDKから使えるS3互換エンドポイントを提供しているのに、なんだってこんなことをする必要があるでしょう?そのプラグインに関して変更が必要だったのは、エンドポイントといくつかの設定の変更だけで、これはわたしのControllerのコードの3行だけ(以下の4~6行目)で済みました。
BlogController(BlogService blogService, AmazonS3Service amazonS3Service) {
this.blogService = blogService
this.amazonS3Service = amazonS3Service
this.amazonS3Service.client.clientOptions.pathStyleAccess = true
this.amazonS3Service.client.clientOptions.chunkedEncodingDisabled = true
this.amazonS3Service.client.endpoint = "${grailsApplication.config.codes.recursive.aws.s3.namespace}.compat.objectstorage.${grailsApplication.config.codes.recursive.aws.s3.region}.oraclecloud.com"
}
次に、わたしはGrails Mailプラグイン設定をAWS SESサーバーからOCIサーバーに交換しました。これらの設定はコンソールのサイドバーメニューのEmail Deliveryの配下、Email Configurationから見つけました。
ここで設定が表示されます。
設定ページの'Manage SMTP Credentials'をクリックするとユーザー管理セクションに遷移して、アプリケーションで使う認証情報を生成することができます。

アプリケーションのデプロイ

この時点でDBの作成と移行、オブジェクトの移行、および新しい環境(Oracle CloudのDB、オブジェクトストアおよびEメール配信)で動くようにアプリケーションの設定が完了しました。次のステップはアプリケーション自体のデプロイで、これにはコンピュートインスタンスの作成が必要になります。これを始めるため、コンソールダッシュボードに戻って、'Create a VM Instance'をクリックします。
インスタンスに名前を付けて、OSイメージを選択します。
次に、それを使ってインスタンスに接続できるようにしたいSSHの公開鍵をアップロードして'Create'をクリック。
インスタンスが作成されると、そのインスタンスの詳細を見ることができます。パブリックIPアドレスをメモっておきましょう。これはそのマシンにSSH接続('opc'ユーザーと指定したSSH鍵で)をする際に使うことになりまうs。Webトラフィックを受け入れたい場合はイングレスルールをいくつか追加する必要があるので、ここに表示されるサブネットをクリックしましょう。
サブネット詳細ページの左側のメニューから、'Security Lists'をクリックしてデフォルトセキュリティリストを選択しましょう。
ポート80およびポート443へのトラフィックを許可するイングレスルールを追加します。
この時点で、わたしはTomcatをインストールしてWARファイルをアップロードし、デプロイしました。わたしの場合にはさらにいくつかSSL証明書のセットアップが必要だったんですが、それでも全体を通じとても平易な移行でした。

まとめ

OracleにはFree Tierがあり、ほんとうにFreeです。使うのに全く費用はかかりません。ずっと。これはすごい、絶対使うべきです。

[Cloud] Microsoft AzureとOracle Cloud Infrastructure上でマルチクラウドアプリケーションを構築/Building Multicloud Apps on Microsoft Azure and Oracle Cloud Infrastructure

原文はこちら

マルチクラウドというストーリーが拡がっており、エンタープライズ企業は複数のインフラ、そしてクラウドプロバイダにまたがってアプリケーションを構築することを望んでいます。最近発表されたOracleとMicrosoftのクラウド・パートナーシップにより、Microsoft AzureとOracle Cloud Infrastructure(OCI)間でのクロス・クラウド・ネットワークや、統一されたIDおよび認証、そして協働的で統合されたサポートモデルが可能になっています。クロス・クラウド・ネットワークはセキュアかつ専有されたリンクであり、ふたつのクラウドプロバイダ間の通信に大容量の帯域と低遅延性を提供します。お客様はこのクロス・クラウドの接続を構築するのに、サードパーティのネットワークプロバイダに依頼する必要がありません。
クロス・クラウド接続によって以下を含む多くのユースケースが可能になります:
  • WebアプリケーションをAzure上に、Autonomous DatabaseをOCI上に
  • JavaとOracleアプリケーションをOCI上に、.NET/SQLサーバーアプリケーションをAzure上に
  • AzureからOCI上のAutonomous Databaseのデータマイニング
  • クラウドをまたいだアプリケーション間のインターオペラビリティ
  • 複数クラウドベンダをまたいだ高可用性
Jamal Arifは最近のこのブログポストで、ユーザーがMicrosoft AzureとOCIとの間のエンドトゥエンドのクラウド相互接続をどれほどかんたんに作成できるかを説明しました。そのシリーズの続きとして、このポストではわたしたち(Samir ShahVinay Rao)からマルチクラウド・2層アプリケーションの構築プロセスを一通りご説明することで、エンタープライズ企業がふたつのクラウドプロバイダそれぞれのベストなサービスを活用したアプリケーションをどのように構築できるかのイメージをつかんでいただこうと思います。
アプリケーションの構築を始めるまえに、アーキテクチャの概要を見ておきましょう。以下の図で、アプリケーション層はAzureコンピュートインスタンス上に居て、データベース層はOracle Autonomous Databaseサービスとなっています。アプリケーション層はデータベースにデータを書き込み、またクエリしますが、この際にトランジット・ルーティングを用いることでセキュアなプライベート接続を通ってアクセスします。

前提の準備事項

アプリケーションのデプロイを始めるまえに、How to set up the interconnect between Oracle Cloud Infrastructure and Microsoft Azureのポストで説明されているステップをこなしておきましょう。

Step 1: OCI上でAutonomous Databaseをセットアップ

  1. Oracle Cloud Infrastructureコンソールにログインしてus-ashburn-1リージョンを選んでください。
  2. クイックアクションメニューからCreate a data warehouseをクリックしてAutonomous Data Warehouseインスタンスをつくります。
  3. ウィザードに従ってAutonomous Data Warehouseインスタンスに必要な項目を入力し、Create Autonomous Databaseをクリック。
    データベースのプロビジョニングには3~5分程度かかります。
  4. Walletファイル(クライアント認証情報)をダウンロードします。
    1. Autonomous Databaseのページから、データベースの横のActionsのアイコン(「・・・」アイコン)をクリックしてService Consoleを選んでください。
    2. Administrationのセクションに移動してWalletファイルをダウンロードします。
      のちのステップでこのWalletファイルを使うことになります。

Step 2: Azure上でのアプリケーション層のセットアップ

  1. Azureポータルにログインします。
  2. 前提の準備事項をこなしているときに作成したネットワークの中にUbuntuのVirtual Machine(VM)を作成します。
  3. ネットワークセキュリティグループの設定で、必要となるデータベースのポートおよび他の接続の許可を行います。
  4. VMが起動したら、SSHでVMに接続してみてアクセス可能なことを確かめましょう。

Step 3: Oracle Servicesへのプライベートピアリングルートをセットアップ

前提の準備事項のステップをこなしていれば、OCIとMicrosoft Azureとの間のプライベートピアリングリンクができあがっていると思います。であれば、ふたつのインフラストラクチャ上のVMはお互いに対してセキュアに接続することができます。
データベースにセキュアプライベート接続を通してアクセスするには、最近アナウンスされたトランジット・ルーティング の機能を使います。この機能を有効にするには、Access Oracle Services Privately with a Service Gatewayのブログポストでの手順に従ってサービスゲートウェイを作成します。
  1. OCIコンソールで、Networking > Virtual Cloud Networkと移動し、VCNを選択してください。
  2. Resources配下のService Gatewaysをクリックし、サービスゲートウェイを作成します。
  3. All IAD Services in Oracle Services Networkに到達できるサービスゲートウェイを作成します。
    サービスゲートウェイが作成できたら、ふたつのルートテーブルを作成します。ひとつはDRGルートテーブル、もうひとつはSGWルートテーブルです。
  4. DRGルートテーブルの作成
    1. Resourses配下のRoute Tablesをクリックし、新規ルートテーブルを作成します。
    2. ターゲットタイプとしてService Gatewayを指定し、デスティネーションサービスはAll IAD Services in Oracle Services Networkを指定します。
  5. このルートテーブルをDRGに関連付けることで、全てのOracle Services NetworkルートをこのDRGの監督化に置きます。
    1. Resources配下でDynamic Routing Gatewaysクリックします。
    2. 作成したルートテーブルがあるVCNに付属のDRGをクリックします。
    3. Actionsアイコン(「・・・」のアイコン)をクリックして、そこからAssociate With Route Tableをクリックします。
    4. 作成したルートテーブルを選択し、Associateをクリックします。
    これでルートテーブルがDRGに関連付けられたので、DRGがAzure Expressルート上のOracle Services Networkルートを監督するようになり、また、これらのルートはVMのルートテーブル上で見えるようになります。
  6. Oracle Services NetworkからのトラフィックがリモートのAzureアプリケーションに到達できるようにするため、SGWルートテーブルを作成します。ターゲットタイプとしてDynamic Routing Gatewayを指定し、デスティネーションCIDRブロックにはAzure Expressルートのアドレスを指定します。
  7. SGWルートテーブルをサービスゲートウェイに関連付けます。
    1. Resources配下のService Gatewayをクリック。
    2. 対象のサービスゲートウェイの横のActionsアイコン(「・・・」のアイコン)をクリックして、Associate With Route Tableをクリック.
    3. 作成したルートテーブルを選択し、Associateをクリック。

Step 4: アプリケーションのインストール

これで接続のセットアップができたので、データベースからデータをマイニングするアプリケーションをインストールします。
  1. Step 1でダウンロードしておいたWalletファイルをアップロードし、フォルダにZIPを解凍し、その中のファイルを使ってAutonomous Data Warehouseデータベースにアクセスします。
  2. このリポジトリからアプリケーションをクローンします。
  3. アプリケーションを実行します。
これで完了です!このシンプルなPythonアプリケーションがAzure VNET上で稼働し、Autonomous Data Warehouseデータベースからプライベートかつセキュアにデータをマイニングできます。

まとめ

このポストをお楽しみいただけたら幸いです。AzureとOracle Cloud Infrastructureをまたいでお客様がどんなアイデアやアプリケーションを実現することができるかの、必要最小限の例として、ここではサンプルの2層アプリケーションをご紹介しました。