kei0425tan’s blog

技術的なことを主に

AWS RDS使ってみました。(インスタンス作成からphpmyadminまで)

AWSの無料枠で、RDSもあったので、使ってみました。

普通に自分でサーバーを立てるよりも、フルマネージドのほうが細かいお世話としなくていいなということで。

RDS入門とか始め方とか初心者向けとかでいい感じのが見つからなかったのでメモっておきます。

接続元のIPアドレスの確認

AWSで全部完結するならもう少し簡単なのかもしれませんが、今回は外部から接続します。
そのため、接続元のIPアドレスを調べる必要があります。

接続元で以下のコマンドを実行すれば、IPアドレスを知ることができます。

$ curl ifconfig.me

セキュリティグループの作成

DB接続用ポートを開けなければならないため、まずはセキュリティグループを作成します。

f:id:kei0425tan:20170530133428p:plain

VPCを選択します。

f:id:kei0425tan:20170530133504p:plain

セキュリティグループを選択します。

f:id:kei0425tan:20170530133549p:plain

セキュリティグループの作成をクリックします。

f:id:kei0425tan:20170530133653p:plain

グループ名と説明を入力します。
今回はmysql用に作成するため、mysqlとします。

その後、作成をクリックします。

f:id:kei0425tan:20170530133833p:plain

作成したグループを選択し、編集をクリックします。

f:id:kei0425tan:20170530135213p:plain

タイプに「MySQL/Aurora(3306)」を選択し、送信元に最初に調べたアドレスをCIDR表記で記入し、保存します。
最初に調べたアドレスに/32を付ければよいです。
複数の接続元がある場合には、そのIPアドレスに応じて/32を調整したり、複数行記述したりします。

※cloud9から接続する場合には、104.199.0.0/16にするとよさそうです。

RDBインスタンスの作成

やっと、RDBの作成に入ります。

f:id:kei0425tan:20170530133428p:plain

RDSを選択します。

f:id:kei0425tan:20170530105512p:plain

今すぐ始めるをクリックします。

f:id:kei0425tan:20170530105544p:plain

無料利用枠のみの対象をチェックすると、有料のものはすぐにわかるようになるので便利です。
今回は、MySQLではなく、上位互換といわれているMariaDBを使ってみます。

f:id:kei0425tan:20170530105747p:plain

無料では選択できる個所は少ないです。
バージョンはせっかくなので、一番新しいのにしてみました。
お好みを選んでください。

DBインスタンス識別子は、エンドポイントの一部になります。
リージョンでユニークなものを指定してください。
マスターユーザの名前、マスターパスワードはお好きなものに。
あとで、phpmyadminなどで接続するときに必要になります。

f:id:kei0425tan:20170530105934p:plain

VPCセキュリティグループには、先ほど作成したmysqlを選択します。
データベース名は、あとから追加できるので適当でも問題ありません。

他はデフォルトでいいでしょう。

以上で設定は終了です。

作成にしばらく時間が掛かって出来上がりです。

疎通確認

しばらく待つとこんな画面になります。
(詳細を開いています。)

f:id:kei0425tan:20170530152956p:plain

ステータスが利用可能になると、エンドポイントが表示されます。
これで接続可能です。

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を作る

kei0425tan.hatenablog.com

というわけで、まずは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"
            }
        ]
    };
    
});

APIのレスポンスはJSONで返します。

  • response_type → "in_channnel"を指定するとチャンネル全員が見えます。"ephemeral"を指定するとコマンドを発行した人のみに見えます。デフォルトでは、"ephemeral"を指定したのと同じです。
  • text → 表示するメッセージです。
  • attachments → 追加情報。引用みたくみえます。

さあ、ここまでできれば、あとは自由自在にコマンドを作れますね。

レッツコーディング!

AWSで何をするのか

いろいろやりたいことがたくさんあるのですが、こんなことをやりたいなと思っています。

  • slackと連携していろんなbotを作成する。
  • 気になるホームページの更新のお知らせ。
  • アプリケーション(スマホやwebアプリなど)のバックボーン

slackと連携していろんなbotを作成する。

スマホしか持っていない友達がブログを作っているのですが、よくお店の地図のタグ送ってと頼まれます。
PCで検索して共有を選んでコピペするだけなのですが、時間が掛かって申し訳ないなぁと思ったりします。
それをbotでさくっと出せたら便利かな。

あと、メールでしか来ないお知らせを、slackに転送したりとかもしたいですね。
これは、サクラのクラウドで実現してたのですが、サクラの仮想マシンは高いので削除してしまいました。

利用するだろうAPI

  • AWS lambda → slackのbot
  • Google MAP API → お店のランドマーク検索

気になるホームページの更新のお知らせ。

自社のホームページが更新されても現状社内にお知らせがきません。
上長に更新のお知らせを社員にしたほうがよいのではと提案したところ、そんなものは自分でこまめにチェックしろといわれてしまいました。
なので、botで更新チェックできたらいいなぁ。。。
ちなみに、頻繁に更新されるものではないので、RSSも設定されていません。

あと、住宅ローン金利を更新されるたびにgoogle spread sheetに保存するのは、google apps scriptを利用してやってたりします。

利用するだろうAPI

  • AWS lambda → slackのbot
  • AWS DynamoDB → 更新前のhtmlの保存用

アプリケーション(スマホやwebアプリなど)のバックボーン

直近で作成したいのが、体重管理アプリ。個人的にはwebアプリのほうが便利かなぁと思っているけど、androidiPhone用アプリもあったらいいのかな?

利用するだろうAPI

  • AWS lambda → slackのbot
  • AWS RDS → 日々の記録用
  • Google API → ユーザ管理用


こうみてみると、EC2でホストマシンを立てて、そこにapacheやらpostgresやらインストールしてって思っていたのですが、実はもうそういう時代は終わったのかなぁと思っています。

claudia.js使ってAWS lambdaはじめました

いろいろ調べてみたら、claudia.jsを利用すると簡単にAWS lambdaを利用できるようです。

とはいうものの、ほんとにはじめの一歩になるのでかなり苦労しました。

例によって、実行環境はcloud9を利用します。

cloud9でのワークスペースの作成

テンプレートにpython用を選択して作成すること。

最初はなんでもいいやということで、blankを選択したのですが、AWSCLIコマンドをインストールするのに、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のインストール

pipで簡単にインストールできます。

$ sudo pip install awscli

まあ、こちらのほうが詳しいですね。
docs.aws.amazon.com

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のインストール

ここからは英語ですがチュートリアルがあります。

claudiajs.com

しかし、残念ながら私は英語苦手なのでこちらを参考にしました。
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のところで参照できます。
最初アクセスしたときは、スタートアップ画面しかでてこなかったので、適当な関数を一度登録したところ、表示されるようになりました。
右上にリージョン選択があるので、「東京」を選んでくださいね。

AWSはじめました

AWSずっと気になっていたんですが、なぜかメジャーに負けてはいけないような気がしてなかなか使っていませんでした。

でも、1年間無料で利用できるんですね。
なので、お試しで使い始めてみました。

アカウント登録に必要なもの。

  • クレジットカード

JCBでも大丈夫でした。

  • 通話できる電話

→ 本人確認のため電話がかかってきます。それで4ケタの認証番号を入力します。LINEとかと違って、SMSではないので通話ができないとダメです。

これからいろいろ試していきたいなぁ。。。。