DataPipeline で RDS to S3 を使ったメモ


設定にハマって六時間かかって悲しかった。

公式で言うと [Full Copy of RDS MySQL Table to S3 -- docs.aws.amazon.com](https://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/dp-template-copyrdstos3.html) あたりの事。

ハマった原因は、ボクが理解してなかった`VPC`まわりの仕組みと、これに使うにあたって必要なSecurityGroupの仕組み、複数ある `default` と使用する `default` の違いです。

とりあえずハマっていた時のエラーメッセージ

## EC2インスタンスの立ち上げ失敗

`The specified instance type can only be used in a VPC. A subnet ID or network interface ID is required to carry out the request.`

EC2インスタンスは立ち上げる時は _VPC_ もしくは _非VPC_ で立ち上げますが、今回は _RDS_ が _VPC_ 上で立ち上がっていたので、 _VPC_ で立ち上げる必要があった。

_VPC_ で立ち上げる時は、 _Subnet ID_ と _SecurityGroup Ids_ を指定します。

一方 _非VPC_ で立ち上げる時は _myEc2RdsSecurityGrps_ を指定します。

例えば _Subnet ID_ と _myEc2RdsSecurityGrps_ を一緒に書いてしまうと、`The specified instance type can only be used in a VPC. A subnet ID or network interface ID is required to carry out the request` と言われて怒られます。

see: [リソースの設定 -- https://docs.aws.amazon.com/ja_jp/datapipeline](https://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/dp-resources-vpc.html#dp-configure-resource)


## `VPC` で立ち上げる

1. `myEc2RdsSecurityGrps` を _空白_ にします。
2. `Subnet ID`と`SecurityGroup Ids` を `Add an optional field..` で追加して記入します。ここに記述する `Subnet ID` や `SecurityGroup Ids` は[VPC のSubnet](https://console.aws.amazon.com/vpc/home#subnets:)にあるIDと、[VPCのSecurityGroups](https://console.aws.amazon.com/vpc/home#securityGroups:)にあるIDの事です。

参考に、下記の図のように、`SubnetID`が`subnet-aaaa`、`SecurityGroup Ids`は `sg-aaaaa`と`sg-bbbbb`の二つを指定しています。

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/1054/39a437c0-7c46-5d10-ba85-f00882932f02.png "p2.png")



ここで `t2.micro` など`T2`系を指定していると `Virtualization type 'hvm' is required for instances of type 't2.micro'. Ensure that you are using an AMI with virtualization type 'hvm'. For more information, see http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/virtualization_types.html` と言われてコケます。

こちらでは `M3` 系のインスタンスにしたら `VPC` 上で起動をしました。

`VPC`で立ち上げるインスタンスタイプは`HVM`のインスタンスストアでないと駄目っぽいです。イマイチよくわかっていないけど。

see: [Instance type Matrix -- aws.amazon.com/jp](https://aws.amazon.com/jp/amazon-linux-ami/instance-type-matrix/)

### 間違って _非VPC_ で起動した時

起動はします。ただ、 `RDS` が `VPC` 上にあるので、S3に保存するログ・ファイルにはエラーが書かれて終わってると思います。((どのエラーかわからなくなった…))

# RDS に接続できない。

幾つか原因がありました。

1. EC2のインスタンスとRDSのインスタンスが、VPCで切り離されている
	2. RDSに合わせるしかありません。
3. myRDSInstanceId がわからず、Timeoutが起きている？
	4. [RDS](https://console.aws.amazon.com/rds/home)にある _インスタンス名_ の事です。名前変えんといてくれ。
	5. なお、適当な文字を入れて Validation に引っかかった時は、 `db-instance-id is not a valid identifier. Identifiers must begin with a letter; must contain only ASCII letters, digits, and hyphens; and must not end with a hyphen or contain two consecutive hyphens. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue;` というエラーが起きます。
	6. Validation に引っかからないけど、存在しない `instance-id` の時は `DB hogehoge Instance Not Found` と言われます。

## RDSの特定DBに接続できない

DataPipeline で作成した時には、Database name を入力するフィールドが 2016/10/03 現在ではありませんでしたので、接続開始しようとした時に _null_ データベースに接続しようとしてコケます。

ログとしてはこんな感じ。

```
03 Oct 2016 05:42:48,337 [ERROR] (TaskRunnerService-resource:df-....@Ec2Instance_2016-10-03T05:39:08-0) df-... amazonaws.datapipeline.database.ConnectionFactory: Unable to establish connection to jdbc:mysql://A-instance.----.-----.rds.amazonaws.com:3306/null Communications link failure
```

対処として、一度作成した後、 _Edit Pipeline_ で _RdsDatabase_ を選び、`Add an optional field...` で追加する。

## S3に保存したファイルは、変な所に書き出される。

バケットとディレクトリ？を指定しても、空白ディレクトリが作成されているだけでよくわからないことになっている。何のバグかわかりませんが、その空白名のディレクトリが作成されてその中に保存されています。 [AWS s3](https://console.aws.amazon.com/s3/home) のページから辿って見ていったほうが良いかもです。

とりあえず以上