oracleのRDSを立てたときにエラーが出てはまった話です。
同じようにはまる人のためと自分のメモのために残しておきます。
実現したかったこと
VPC内のEC2インスタンスから同一VPC内にあるRDS(oracle)へsqlplusで接続しようとしました。
RDSはパブリックアクセス不可の設定です。
発生したエラー
> sqlplus username/password@db_instance_identifier.abcdefghijklmn.ap-northeast-1.rds.amazonaws.com:1521/orcl
ORA-12154: TNS:could not resolve the connect identifier specified
ただし、IPアドレスだと通ります
> sqlplus username/password@11.22.33.44:1521/orcl
原因(と思われるもの)
こんな記事を見つけました。
http://toatoshi.hatenablog.com/entry/2014/06/16/201922
ホスト名(Endpoint)の制限値が63byteとなっているようで、それ以上になるとsqlplus側でホスト名をハンドルできない状態となりORA-12154が出力するようです。
たしかに、VPC内にRoute53でDNSを設定し、CNAMEレコードを作成して63byte/64byteで試してみると確かにそのような挙動になっている・・!
AWSのデフォルトのサブドメインが結構長いのでDBインスタンス名が少し長くなっただけでこの問題に引っかかってしまいますね。
対策
tnenames.oraに書く接続記述子を指定して接続すればOK。
> sqlplus username/password@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=db_instance_identifier.abcdefghijklmn.ap-northeast-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))
SQL>
めでたしめでたし。