oracleRDSへの接続でORA-12154エラー

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> 

めでたしめでたし。

続きを読む

データウェアハウスの概要とRedShift

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
データウェアハウスの概要

データウェアハウスは何のために存在しているのか

一般的なリレーショナルデータベースでもデータの集計などを行えますが、データが多くなると処理に時間がかかって効率的な作業が難しくなります。そのため、大量のデータを効率良く処理できるようなシステムが必要となり作られたのがデータウェアハウスです。

データウェアハウスは、リレーショナルデータベースよりも大量のデータを高速で処理できるような構造が採用されています。

しかし、データウェアハウスは幅広い用途で用いられるものではなく、大量のデータを扱う特定の用途向けのシステムとして使われるものです。

データウェアハウスの特徴

データウェアハウスには大量のデータの集計や分析が効率的にできるように、特定の行に対する処理が得意な列指向データベース(カラムナデータベース)が用いられます。
列指向データベースは一般的なリレーショナルデータベースよりも、大量のデータを高速で処理することが可能な集計や分析に特化されたデータベースです。

そして、容易にスケールアウトできるように、分散処理が容易な構造となっています。
そのため、急に処理するデータ量が増えても短期間でスケールアウトができますし、性能を向上するために簡単にスケールアウトできるので低コストでシステムを構築することが可能です。

代表的なデータウェアハウス

データウエアハウス(DWH)を構築するために、DWH用のDBMSとストレージを含む専用ハードウエアから構成されるDWHアプライアンスを導入するケースが少なくありません。
DWHアプライアンスの代表的な製品としては、OracleのExadataやIBMのNetezzaなどがあります。

Oracle Exadata
・会社規模の利用や大規模なデータを扱う
・Oracle Databaseを使用
・オンラインのトランザクション処理にも適している

IBM Netezza
・企業内の一部の部署で使うことを想定している
・オープンソースPostgreSQLをもとにしている
・複雑な処理をするのに適している

DWHアプライアンスは最初からデータウエアハウスが構築されているために、複雑なチューニングやカスタマイズをしなくても、十分に性能が発揮できます。しかし、より低コストで手軽に使えるクラウド上のデータウエアハウスAmazon RedShiftなども、利用者が増えています。

AWSのデータウェアハウス: RedShift

AWSのデータウェアハウス、RedShiftは圧倒的に安価、容易にスケールアウトでき、フルマネージドのサービスのため手軽に扱うことができます。機能的な特徴として、カラムナーデータベースとMPP、サービス面としての特徴として圧倒的に安価、フルマネージドのサービスがあげられます。

カラムナーデータベース

大規模なデータを扱うデータウェアハウスは、カラムごとの処理を行うカラムナーデータベースが有効ですが、RedShiftもカラムナーデータベース(カラム型DB)です。

・カラムナーデータベースはある特定のカラムだけ操作できるので、集計処理などを高速で行うことができます
・同一のカラムの内容は、同じデータが繰り返して使われることが多いので、圧縮効率が良くなるために記憶領域を有効に使えます

MPP(Massively Parallel Processing)

RedShiftはMPPによって、リソースを共有せずに線形スケールを可能とするシェアード・ナッシングを実現しています。そのため、インスタンスを追加することでデータの容量を増やすだけではなく、処理能力も向上させることも可能です。大量のデータを扱うデータウェアハウスは、このような機能を持つことが不可欠となっています。

圧倒的に安価

一般的なデータウェアハウスを購入する場合よりも、Amazon Redshiftを利用することで年間の費用を1/10~1/1000にすることも可能です。
しかも、機能的には一般的なデータウェアハウスとほとんど変わりませんので、クラウド環境でデータウェアハウスを利用する場合は、Amazon Redshiftが最もコストパフォーマンスの良い選択肢の一つとなります。

クラウド上のデータウェアハウスなので手軽に使える

Amazon RedShiftはクラウド上のデータウェアハウスなので、AWSマネジメントコンソールを数回クリックするか、プログラムからAPIを呼び出すだけで簡単に使うことができます。
システムのことは、ほとんどAmazon RedShiftが自動的に管理してくれますので、データウェアハウスのためにエンジニアを雇用する必要もありません。
Amazon RedShiftは手軽に使えて、コストも削減できるデータウェアハウスです。

続きを読む

RDSのIAM認証 (aws−cli編) 【cloudpack大阪ブログ】

cloudpack大阪の佐々木です。

RDSの認証をIAMでできるという話です。
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html

基本的な設定はこちらを参照
http://qiita.com/Pampus/items/18b45330b990927652fd

認証に必要なTokenをaws-cliで取得できるようになってました。

aws-cliをアップデートします。

$ sudo pip install -U awscli
$ aws --version
aws-cli/1.11.81 Python/2.7.12 Linux/4.9.17-8.31.amzn1.x86_64 botocore/1.5.44

aws rds generate-db-auth-token コマンドが使えるようになっています。

NAME
       generate-db-auth-token -

DESCRIPTION
       Generates an auth token used to connect to a db with IAM credentials.

SYNOPSIS
            generate-db-auth-token
          --hostname <value>
          --port <value>
          --username <value>

OPTIONS
       --hostname (string) The hostname of the database to connect to.

       --port (integer) The port number the database is listening on.

       --username (string) The username to log in as.

実行するとトークンが発行されます。

$ aws rds generate-db-auth-token --hostname test.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 3306 --username testuser --region ap-northeast-1
test.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306/?Action=connect&DBUser=testuser&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Date=20170427T134947Z&X-Amz-SignedHeaders=host&X-Amz-Security-Token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&X-Amz-Credential=xxxxxxxxxxxxxxxxxxxxxx2Faws4_request&X-Amz-Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

これをパスワードにして接続します。

$ mysql -u testuser -h test.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p`aws rds generate-db-auth-token --hostname test.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 3306 --username testuser --region ap-northeast-1` --ssl-ca=rds-combined-ca-bundle.pem
ERROR 2059 (HY000): Authentication plugin 'mysql_clear_password' cannot be loaded: plugin not enabled

んん?

--enable-cleartext-plugin ってのがいるらしいです。
https://dev.mysql.com/doc/refman/5.6/ja/cleartext-authentication-plugin.html

$ mysql -u testuser -h test.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p`aws rds generate-db-auth-token --hostname test.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 3306 --username testuser --region ap-northeast-1` --ssl-ca=rds-combined-ca-bundle.pem --enable-cleartext-plugin
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 711
Server version: 5.7.16-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql>

続きを読む

JenkinsおじさんのためのAWS Batch

はじめに

この記事の対象者

主にこんな感じの人をターゲットにしています。

  • Jenkinsでジョブを管理している
  • AWSをcliで触るのは実は大変…。GUIでやりたい
  • Dockerはインストールはしているけれど、あんまり触ったことが無い

また、本記事執筆時点では、us-east(virginia)でのみ利用可能なので、VPCでの利用はあまり想定していません。 (VPNを繋げば出来ると思いますが…)
本来はAuto ScalingやSPOTインスタンスと組み合わせたりといろいろあるのですが、私的事情により、志は低く、過疎っているJenkinsサーバを廃止(サーバレス化)することを目標にしています。

対象のJenkinsジョブ

今回ターゲットにするのは、Jenkinsだと一般的と思われる以下の処理とします。

  • JDKがバージョン指定で入っている
  • バッチ処理の入ったリポジトリをgit cloneしてくる
  • シェルスクリプトからごにょごにょして、リポジトリの中身を実行する

PHPやRubyなど別言語の人は、Javaな部分は脳内で別言語に置き換えてみてください。

AWS Batchでの流れ

Jenkinsでごく一般的なこの処理をAWS Batchでやろうとした場合、以下のような流れが一番シンプルになるかなと思います。

  1. JDK等、必要な実行環境を準備したDockerfileを作成する
  2. Jenkinsでやっていたシェル相当のシェルスクリプトを作成する
  3. リポジトリにDockerfileとシェルスクリプトを追加する
  4. Amazon ECRに設定を作成する
  5. Dockerfileでビルドし、JDK及びバッチ処理のリポジトリの入ったコンテナを作成し、ECRにプッシュする
  6. AWS Batchの設定(IAM Role, Compute Environment, Job Definition等)を作成する
  7. AWS Batchを実行する

というわけで、ハンズオン的に進めて行きたいと思います。

作業手順

1. Dockerfileの作成

古風なエンジニアにはこちらの記事が一番わかりやすいんじゃないかと思います。

効率的に安全な Dockerfile を作るには

今回のケースだとJavaのバッチ(Hello.class)を動かしたいので

$ ls
Hello.class

$ vim Dockerfile

として、以下のようなDockerfileを作成します。

Dockerfile
FROM centos:6

RUN yum install -y java-1.7.0-openjdk java-1.7.0-openjdk-devel
ENV JAVA_HOME /usr/lib/jvm/java-openjdk
RUN mkdir /opt/batch-directory
COPY . /opt/batch-directory/
WORKDIR /opt/batch-directory

Javaは諸々の事情からOpenJDKにしていますが、Oracle Javaが必要な場合は、少し手間はかかりますが、Oracle Javaでもコンテナを作成することはできます。また、本来だとベースイメージはAmazonLinuxだったりJavaが入ったコンテナの方が良いと思いますが、保守的な方のために、敢えてCentOSにしました。(あんまり意味ないかな…)

2. シェルスクリプトの作成

Jenkinsにバッチを実行するためのシェルスクリプト(Jenkinsでコマンド欄に入れていたようなもの)を作ります。

$ ls
Dockefile
Hello.class

$ vim batch.sh

今回は解説用なので雑なものを用意しています。

batch.sh
#!/bin/bash

java -version
java Hello

3. Dockerfileとシェルスクリプトをリポジトリに追加

せっかく作成したので、これらのファイルをGitリポジトリに追加しましょう。(これはこの後の工程上の必須項目ではないので、一連がテストされてからでも大丈夫です)

4. Amazon ECRにリポジトリを作成する

Amazon EC2 Container Registry(ECR)にリポジトリを作成します。ここではリポジトリ名を入れるだけです。
Amazon EC2 Container Service.png

5. Dockerfileでビルド

先ほど付けた名前を使って、Docker buildをします。

$ docker build -t unagi/jenkins-ojisan .

6. コンテナをECRに登録する

タグ付けして、先ほど作成したECRに登録してあげます。

$ aws ecr get-login --region us-east-1

# これでdocker loginに必要なコマンドがでてくるので、実際はそれを使う
$ docker login -u AWS -p xxxxxx -e none https://xxxx.dkr.ecr.us-east-1.amazonaws.com
$ docker tag unagi/jenkins-ojisan:latest xxxx.ecr.us-east-1.amazonaws.com/unagi/jenkins-ojisan:latest
$ docker push xxxx.ecr.us-east-1.amazonaws.com/unagi/jenkins-ojisan:latest

7. AWS Batchの設定をつくる

Job definitionとCompute environmentを設定します。

こちらがJob definitionで、コンテナを起動するときの設定になります。環境変数を設定できるので、パラメータを渡したい場合は使う事ができます。
AWS Batch (1).png

S3アクセス等でIAM Roleを使いたい場合は、ここで定義するJob Roleで定義する必要があります。そしてさらに分かりにくいことに、ここに表示されるIAM Roleを作るためには、信頼するエンティティがAmazon EC2 Container Service Task Role(ecs-tasks.amazonaws.com)のIAM Roleを作る必要があります。IAM Role作成時に似たようなのが沢山あるので、非常に解りづらいところです。

そして、次の画面はCompute environmentです。
AWS Batch (2).png
こちらはあまり見所は無く、淡々と設定していきます。ここで出てくるRoleは、ECSで動作するために必要なもので、コンテナで使うモノではありません。なので、適当に作成します…。

8. AWS Batchの実行

Job definitionsからSubmit jobして実行します。実行時に先ほど設定した環境変数を変更しながらの実行等もできます。
ちなみにこれも凄く分かりにくいのですが、Job definitionを編集したい場合はCreate new versionです。新しいバージョンの定義が出来てしまうので、古い方は不要になった段階で削除してしまいましょう。

9. 実行ログの確認

CloudWatchのログから見ます。Submitしてから起動までは少し時間がかかるので、少し待たないとログ出力はされません。

あとがき

Jenkinsおじさん的には、Dockerが出てくるため取っつき辛い印象を持つのかなと思います。
美しくDockerを使う場合はさておき、バッチ処理をやるだけであれば、Dockerfileに書くのはバッチサーバを作るときのセットアップコマンドで、一回やってしまえばあまり難しくないです。

続きを読む