現在位置: ホーム / ビッグデータ ブログ / AWS VPC内のRDSにTreasureDataからResult Outputする

AWS VPC内のRDSにTreasureDataからResult Outputする

TreasureDataを使ったシステムを作る際に、BIツールの参照用にデータマートを使った構成にすることがあります。 その場合、データマートとしてRDSをつかってRDBを構築するのですが、AWSではVPCがデフォルトのため、構築したRDBをTreasureDataから見える状態にする必要があります。 その際の確認ポイントをまとめます。

2015-04-07_arch

もしもRDSにTreasureDataからアクセスできない状態の場合は、下記のエラーがクエリ実行時に表示されます。

15/04/04 08:19:39 INFO result.AbstractJDBCResult: Mode: replace
15/04/04 08:19:40 INFO result.PostgreSQLResult: Method: copy
15/04/04 08:19:40 INFO result.ResultWorker: Data size: 27,875 bytes (compressed)
15/04/04 08:19:40 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
15/04/04 08:19:40 INFO compress.CodecPool: Got brand-new decompressor [.gz]
15/04/04 08:20:43 INFO result.AbstractJDBCResult: Operation failed (0:08001), retrying 1/12 after 1 seconds. Message: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. < Connection timed out
15/04/04 08:21:47 INFO result.AbstractJDBCResult: Operation failed (0:08001), retrying 2/12 after 2 seconds. Message: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. < Connection timed out
15/04/04 08:22:52 INFO result.AbstractJDBCResult: Operation failed (0:08001), retrying 3/12 after 4 seconds. Message: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. < Connection timed out
15/04/04 08:22:52 INFO result.AbstractJDBCResult: Error details:
org.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

 

Amazon VPCの設定

それでは始めにVPCの設定を行います。
参考:Amazon Virtual Private Cloud (VPC) での Amazon RDS の使用

VPCの作成

Start VPC WizardからVPCの作成を開始します。設定項目としては下記となります。

  • IP CIDR block: ブロック範囲を広くとりすぎると、新規で取得できなくなるので、適度な範囲で設定
  • VPC Name: 任意の名前
  • Public subnet: 同様に適度な範囲で設定
  • Availability Zone: 任意
  • Enable DNS hostnames: Yes
  • Hardware tenancey: Default(詳しくはこちら

2015-04-07_createvpc

VPC作成後に、DNS resolutionとDNS hostnamesがYesであることを確認します。
DNS resolutionをYesにすることで、DNSの名前解決を有効にすることができるようになります。
DNS hostnamesをYesにすることで、インスタンス起動時にパブリックDNSの付与を行うようになります。

2015-04-07_checkvpc

Subnetの作成

VPC作成時にはサブネットが一つしか作られません。
しかし、RDSを作成する際に、Multi-AZ構成にするためには、各Availability Zone上のサブネットが必要になるため、Tokyo Regionであれば、1aと1cの両方にSubnetを作成しておきます。

2015-04-07_subnet

RouteTableの設定

RouteTableのDefaultの設定では、同一のサブネットのみのルーティングになっているため、
TargetにInternet Gatewayを追加します。

DestinationTargetStatusPropagated
172.32.0.0/16 local Active No
0.0.0.0/0 igw-7e7a8a1b Active No

加えて、上記で作成したサブネットをSubnet Associationsで紐付けておきます。

SecurityGroupの設定

DefaultのセキュリティGroupはInboundの設定に同一のセキュリティグループからの通信しか許可されていません。そのため、セキュリティグループの設定にてPort5432を外部公開するようにします。

TypeProtocolPort RangeSource
ALL Traffic ALL ALL sg-c31c9ca6 ( default )
Custom TCP Rule TCP (6)  5432 0.0.0.0/0

 

RDSの設定

VPCの設定まで完了したら、次にRDSのセットアップを行います。今回は、PostgreSQLを使います。

PostgreSQLの選択

2015-04-07_rds1

Multi-AZの設定

2015-04-07_rds2

DBの詳細設定

2015-04-07_rds3

ネットワークなどの詳細設定

  • VPC: 上記で作成したVPCを選択する
  • Subnet Group: 同様
  • Publicly Accessible: Yes
  • VPC Security Group: 同様

2015-04-07_rds4

 

疎通確認

さて、ここまでで設定がうまくできていれば、外部から疎通ができるようになっているはずです。試してみましょう。

nslookupコマンドでcanonical name(CNAME)を取得できていますね。

$ nslookup test-toru.c406m5p7cd6b.ap-northeast-1.rds.amazonaws.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
test-toru.c406m5p7cd6b.ap-northeast-1.rds.amazonaws.com canonical name = ec2-52-68-70-42.ap-northeast-1.compute.amazonaws.com.
Name: ec2-52-68-70-42.ap-northeast-1.compute.amazonaws.com
Address: 52.68.70.42

ちなみに、Publicly AccessibleやDNS resolutionがNoの場合は、下記の結果になります。CNAMEが得られていないことがわかります。

$ nslookup rds-toru.c406m5p7cd6b.ap-northeast-1.rds.amazonaws.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: rds-toru.c406m5p7cd6b.ap-northeast-1.rds.amazonaws.com
Address: 172.32.0.210

 

TreasureDataでのResult Output to PostgreSQL

TreasureDataではクエリの実行結果を書き込むためには、New QueryからResult Exportの設定を行います。

  • Export to: Postgres
  • Host: RDSのDNS名
  • Username: RDSのユーザ名
  • Passowrd: RDSのパスワード
  • Use SSL: 任意 (Default=false)
  • Require valid SSL certification: Yesにすると自己証明書が使えない
  • Database: 任意
  • Table: 任意
  • Mode: 任意(詳細はこちら
  • Use compression?: 任意
  • Method: 任意(詳細はこちら
  • Schema: 任意

2015-04-07_export_to

上記を設定後、クエリを実行し、Successとなることを確認しましょう。

2015-04-07_query

ステータスがSuccessになったあと、PostgreSQLにもアクセスし、新たにテーブルが作成されていることが確認できるかと思います。

$ psql -h test-toru.c406m5p7cd6b.ap-northeast-1.rds.amazonaws.com -U awsuser -W -d testdb -p 5432
testdb=> \d
public | testtable | table | awsuser
testdb=> \d testtable
hour | text |
host | text |
cnt | bigint |

 

補足: TreasureDataからの書き出し元IPアドレスを特定するためには、アドバンストセキュリティというプレミアムプラン以上のユーザのみが今の所使えるようになっています。

 

まとめ

今回は、TreasureDataからRDSに直接書き込みを行うための方法についてまとめました。
次回は、この書き込み可能になったRDSをデータマートとしてどのようにデータを入れていくかについて、まとめたいとおもいます。

補足(2015-04-07)
今回の構成はあくまでもResult Ouputを検証する際のテストステップとなっております。そのため、本番運用する際の構成は、Internet Gatewayや踏み台サーバを使ってRDSにフォーワードするのが良いかと思います。または、Result Outputではなく、クエリ実行サーバを作り、Pullしてくる必要が現状ではあるかなと思います。

髙橋@SSTD 

タグ: ,