AWS RDS使ってみました。(インスタンス作成からphpmyadminまで)
AWSの無料枠で、RDSもあったので、使ってみました。
普通に自分でサーバーを立てるよりも、フルマネージドのほうが細かいお世話としなくていいなということで。
RDS入門とか始め方とか初心者向けとかでいい感じのが見つからなかったのでメモっておきます。
接続元のIPアドレスの確認
AWSで全部完結するならもう少し簡単なのかもしれませんが、今回は外部から接続します。
そのため、接続元のIPアドレスを調べる必要があります。
接続元で以下のコマンドを実行すれば、IPアドレスを知ることができます。
$ curl ifconfig.me
セキュリティグループの作成
DB接続用ポートを開けなければならないため、まずはセキュリティグループを作成します。
VPCを選択します。
セキュリティグループを選択します。
セキュリティグループの作成をクリックします。
グループ名と説明を入力します。
今回はmysql用に作成するため、mysqlとします。
その後、作成をクリックします。
作成したグループを選択し、編集をクリックします。
タイプに「MySQL/Aurora(3306)」を選択し、送信元に最初に調べたアドレスをCIDR表記で記入し、保存します。
最初に調べたアドレスに/32を付ければよいです。
複数の接続元がある場合には、そのIPアドレスに応じて/32を調整したり、複数行記述したりします。
※cloud9から接続する場合には、104.199.0.0/16にするとよさそうです。
RDBインスタンスの作成
やっと、RDBの作成に入ります。
RDSを選択します。
今すぐ始めるをクリックします。
無料利用枠のみの対象をチェックすると、有料のものはすぐにわかるようになるので便利です。
今回は、MySQLではなく、上位互換といわれているMariaDBを使ってみます。
無料では選択できる個所は少ないです。
バージョンはせっかくなので、一番新しいのにしてみました。
お好みを選んでください。
DBインスタンス識別子は、エンドポイントの一部になります。
リージョンでユニークなものを指定してください。
マスターユーザの名前、マスターパスワードはお好きなものに。
あとで、phpmyadminなどで接続するときに必要になります。
VPCセキュリティグループには、先ほど作成したmysqlを選択します。
データベース名は、あとから追加できるので適当でも問題ありません。
他はデフォルトでいいでしょう。
以上で設定は終了です。
作成にしばらく時間が掛かって出来上がりです。
疎通確認
しばらく待つとこんな画面になります。
(詳細を開いています。)
ステータスが利用可能になると、エンドポイントが表示されます。
これで接続可能です。
mysqlクライアントで接続します。
$ mysql -h エンドポイント(ポートはなし) -u マスターユーザ -p
Enter password: で先ほど指定したパスワードを入力してください。
うまく繋がると以下のようなメッセージが表示されます。Ctl-dなどで抜けてください。
繋がらない場合は、セキュリティグループが間違えている可能性が高いので設定を確認してください。
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 108 Server version: 5.5.5-10.0.24-MariaDB MariaDB Server 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> Bye
phpmyadminで接続
dockerを利用するととても簡単にphpmyadminを動かせます。
docker-compose.yml
phpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=エンドポイント - PMA_USER=マスターユーザ名 - PMA_PASSWORD=マスターパスワード名 volumes: - awsphpmyadmin_sessions:/sessions ports: - 80:80
上記ファイルを作成したら、そこのフォルダで以下のコマンドで実行できます。
% docker-compose up -d
これで好きなようにいじれます。
お疲れ様でした。
dockerでfluentdを動かしてS3互換のidcfクラウドオブジェクトストレージにログを保存する
なかなか情報が見つからず、かなり苦労してしまいましたがうまくいったので記録しておきます。
idcfクラウドが月500円のため、現在利用しています。
www.idcf.jp
(しかも今なら3000円分の利用権が付いていて半年無料!)
準備
- dockerが動くこと
- docker-composeが動くこと
idcfクラウドの設定
現状では、東日本リージョンにしかオブジェクトストレージがありません。
コンピューティング(仮想マシン)がひとつもないと作成できなかった気がします。
コンソールにログインして、オブジェクトストレージを選択します。
その後、APIユーザを作成します。
「APIユーザ追加」をクリックして、ユーザ名を入力するだけです。
AWSと違って簡単ですね。
作成すると、「API Key」と「Secret Key」が表示されます。
ここで閉じてしまっても、またすぐに参照できるので安心してください。
必要なファイルの作成
以下のフォルダを作成します。
% mkdir fluentd-s3-idcf % mkdir fluentd-s3-idcf/plugins
以下のファイルを作成します。
- fluentd-s3-idcf/fluent.cnf
- fluentd-s3-idcf/Dockerfile
- docker-compose.yml
fluentd-s3-idcf/fluent.cnf
<source> @type forward @id forward_input port 24224 </source> <match **.**> type copy <store> type s3 aws_key_id "#{ENV['AWS_ACCESS_KEY_ID']}" aws_sec_key "#{ENV['AWS_SECRET_ACCESS_KEY']}" s3_bucket "#{ENV['FLUENTD_S3_BUCKET']}" # s3_region "#{ENV['FLUENTD_S3_REGION']}" s3_endpoint "#{ENV['FLUENTD_S3_ENDPOINT']}" signature_version s3 path logs/ buffer_path /var/tmp/s3 time_slice_format %Y%m%d-%H time_slice_wait 10m flush_interval 10s utc </store> <store> type stdout </store> </match>
aws s3用の設定は結構みつかるのですが、idcfクラウドの場合は、s3_endpointを指定しなければなりません。
さらに、signature_version s3を指定しないと以下のエラーが発生してアクセスできません。
2017-05-16 08:50:21 +0000 [error]: unexpected error error_class=RuntimeError error=#<RuntimeError: can't call S3 API. Please check your aws_key_id / aws_sec_key or s3_region configuration. error = #<Aws::S3::Errors::InvalidRequest: The authorization mechanism you have provided (AWS4-HMAC-SHA256) is not supported.>>
fluentd-s3-idcf/Dockerfile
FROM fluent/fluentd:onbuild RUN gem install fluent-plugin-s3
fluent/fluentd:onbuild
とタグを指定しないと、ONBUILDを利用していないimageになります。
これを指定することにより、fluentd.confとpluginsが自動的にADDされます。
pluginsは作成していないとエラーになるため、空で作成しておきます。
docker-compose.yml
fluentd: build: fluentd-s3-idcf environment: - AWS_ACCESS_KEY_ID=「APIユーザ作成時のAPI Key」 - AWS_SECRET_ACCESS_KEY=「APIユーザ作成時のSecret Key」 - FLUENTD_S3_BUCKET=「バケット名」 - FLUENTD_S3_ENDPOINT=https://ds.jp-east.idcfcloud.com container_name: fluentd ports: - "24224:24224"
バケット名は事前に作成してなくてもかまいません。
実行
ここまでくれば、あとは実行するだけです。
% docker-compose up -d
お疲れ様でした。
claudia.jsでslack custom commandsを作る
というわけで、まずはslackを使いこなせないと始まりません。
手始めに、custom commandsを使ってみます。
こちらが公式ページ(英語です)
api.slack.com
その前に、ここまでできてる前提で話しますね。
kei0425tan.hatenablog.com
slackの設定
というわけで、AWS lambdaで、web APIは使いこなせる??ようになっているはずです。
なので、slackでの設定を行います。
まずは、slackのチーム名の隣の下向き▼を押して、メニューを出して、「Apps & integrations」をクリックします。
面倒だったら、以下をクリックで!
slack.com
外部連携は基本的にいつもこのページからできるはずです。
その後、右上の「Build」をクリックし、「Something just for my team」をクリックします。
すると、以下の4つが表示されます。
- Incoming WebHooks
→ slackにメッセージを表示する。
- Bots
→ いわゆるBots
- Slash Commands
→ /で始まるコマンド
- Outgoing WebHooks
→ slackの表示されたメッセージを外部に渡す。
今回は、Slash Commandsを作成するので、そちらを選択します。
そうすると、コマンド名を入力する画面になるので、好きなコマンド名を入力します。
すると、まずPOSTデータのサンプルが表示されます。
token=RIKqnGNDN6r2yx01mOkIGgwe team_id=T0001 team_domain=example channel_id=C2147483705 channel_name=test user_id=U2147483697 user_name=Steve command=/weather text=94070 response_url=https://hooks.slack.com/commands/1234/5678
それぞれの意味は以下です。
- token → slackの認識用のトークン。受け取ったらまずここをチェックして違ったら弾くこと。
- team_id → チームID。チームドメインは変更可能だが、team_idはずっとユニークで変更できないはず。
- team_domain → チームドメイン。urlの最初。
- channel_id → チャンネルID。チャンネル名は変更可能だが、こちらはユニーク。
- channel_name → チャンネル名。
- user_id → ユーザID。こちらもユニーク
- user_name → ユーザ名
- command → 入力されたコマンド(/つき)
- text → 入力されたコマンドの引数。日本語も入ります。入力通りに受け取れます。
- response_url → 処理に時間が掛かるときに利用するレスポンス用URL
次に、上から順に以下を設定していきます。
- URL → 前回作成したURL
- Method → POSTのまま
- Token → そのまま。メモっておきましょう。
- Customize Name → 表示するコマンド名。
- Customize Icon → アイコンの変更ができます。
- Preview Message → 上のCustomize NameとCustomize Iconを適用したプレビュー
- Autocomplete help text → こちらを設定しておくと補完が効いてヘルプが見えます。
- Escape channels, users, and links → ここを設定しておくと、POSTデータのtextが拡張されて、一緒にユーザIDなどが来ます。
- Descriptive Label → なんだろう??知ってる人教えてください。
というわけで、大事なのはURLだけですね。
ここでは仮に、
コマンド名は/test
claudiaのpathも
https://yfw8aqrorg.execute-api.ap-northeast-1.amazonaws.com/latest/test
にしましょう。
それで、最後までいったら「Save Integration」をクリックします。
画面は遷移しませんが保存されます。
AWSの設定
とりあえず、前回のスクリプトに以下を追加。トークンは上のトークン入れてくださいね。
api.post('/test', function (request) { if (request.post.token != 'トークン') { return {message:'token error'}; } return { "response_type": "in_channel", "text": "It's 80 degrees right now.", "attachments": [ { "text":"Partly cloudy today and tomorrow" } ] }; });
- response_type → "in_channnel"を指定するとチャンネル全員が見えます。"ephemeral"を指定するとコマンドを発行した人のみに見えます。デフォルトでは、"ephemeral"を指定したのと同じです。
- text → 表示するメッセージです。
- attachments → 追加情報。引用みたくみえます。
さあ、ここまでできれば、あとは自由自在にコマンドを作れますね。
レッツコーディング!
AWSで何をするのか
いろいろやりたいことがたくさんあるのですが、こんなことをやりたいなと思っています。
slackと連携していろんなbotを作成する。
スマホしか持っていない友達がブログを作っているのですが、よくお店の地図のタグ送ってと頼まれます。
PCで検索して共有を選んでコピペするだけなのですが、時間が掛かって申し訳ないなぁと思ったりします。
それをbotでさくっと出せたら便利かな。
あと、メールでしか来ないお知らせを、slackに転送したりとかもしたいですね。
これは、サクラのクラウドで実現してたのですが、サクラの仮想マシンは高いので削除してしまいました。
利用するだろうAPI
claudia.js使ってAWS lambdaはじめました
いろいろ調べてみたら、claudia.jsを利用すると簡単にAWS lambdaを利用できるようです。
とはいうものの、ほんとにはじめの一歩になるのでかなり苦労しました。
例によって、実行環境はcloud9を利用します。
cloud9でのワークスペースの作成
テンプレートにpython用を選択して作成すること。
最初はなんでもいいやということで、blankを選択したのですが、AWS用CLIコマンドをインストールするのに、pipを利用します。
その際に、Python.hが必要になるのですが、blankには入っていませんでした。
それで、ググってみると、sudo apt-get install python2.7-devをすればいいよとあるのですが、なぜかそんなパッケージは見つからないと出てきます。
なので、最初からpython用のテンプレートを選択することによりすんなりと先に進めます。
nodeの確認
python用のテンプレートを利用しても、nvmやnodeはインストールされています。
ところが、バージョンを確認すると、v4.7.3がインストールされています。
AWS lambdaを調べてみると、4.3.2(と0.10.36)しかサポートされていないため、念のため、バージョンを合わせておきます。
$ nvm install 4.3.2 $ nvm alias default 4.3.2
AWS CLIの設定
AWSのページで先にユーザを作成し、アクセスキーとシークレットキーを生成しておきます。
管理ポリシーしは以下の3つを指定しておいてください。
- AWSLambdaFullAccess
- IAMFullAccess
- AmazonAPIGatewayAdministrator
https://aws.amazon.com/jp/developers/access-keys/aws.amazon.com
aws configureで対話形式で設定できます。
$ aws configure AWS Access Key ID [None]: 「アクセスキー」 AWS Secret Access Key [None]: 「シークレットキー」 Default region name [None]: ap-northeast-1(東京) Default output format [None]: json
上記操作により、以下の2つのファイルが作成されます。
~/.aws/credentials
[default] aws_access_key_id =「アクセスキー」 aws_secret_access_key = 「シークレットキー」
~/.aws/config
[default] output = json region = ap-northeast-1
claudia.jsのインストール
ここからは英語ですがチュートリアルがあります。
しかし、残念ながら私は英語苦手なのでこちらを参考にしました。
dev.classmethod.jp
npmでグローバルインストール
$ npm install claudia -g
プロジェクトの作成
$ mkdir web-api-sample $ cd web-api-sample $ npm init
とりあえず、全部エンターでちゃかちゃかやっちゃいましょう。
プロジェクトの dependency に Claudia API Builder を追加
$ npm install claudia-api-builder --save
web-api-sample/app.jsを以下の内容で作成。
var ApiBuilder = require('claudia-api-builder'); var api = new ApiBuilder(); module.exports = api; api.get('/hello', function () { 'use strict'; return 'hello claudia.js'; });
web-api-sample/package.jsonに"files": "*.js"を追加
{ "name": "web-api-sample", "version": "1.0.0", "description": "", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "claudia-api-builder": "^2.4.0" } }
AWSにデプロイ
$ claudia create --name web-api-sample --region ap-northeast-1 --api-module app
結構時間かかります。
何かが間違えてるとエラーになります。
うまく行くと以下のようになります。
saving configuration { "lambda": { "role": "web-api-sample-executor", "name": "web-api-sample", "region": "ap-northeast-1" }, "api": { "id": "yfw8aqrorg", "module": "app", "url": "https://yfw8aqrorg.execute-api.ap-northeast-1.amazonaws.com/latest" } }
そしたら、urlに/hello(app.jsに追加したやつ)を付けてアクセスしてみましょう!
https://yfw8aqrorg.execute-api.ap-northeast-1.amazonaws.com/latest/hello
"hello claudia.js"
と表示されれば完成です!
お疲れ様でした!
ここで作成した関数は、AWSのlambdaのところで参照できます。
最初アクセスしたときは、スタートアップ画面しかでてこなかったので、適当な関数を一度登録したところ、表示されるようになりました。
右上にリージョン選択があるので、「東京」を選んでくださいね。