NewRelicでEC2をモニタリング【cloudpack 大阪 BLOG】

NewRelicでEC2にWordPressをセットアップしてモニタリングしてみました。リソース状況が視覚的によく分かるので、パフォーマンス分析に使いやすいです。また、単にCPU使用率だけでなくプロセスごとのCPU使用率・メモリの推移やアプリケーションのレスポンスタイムの内訳などもグラフで表示されておりシステムのボトルネックを調査するのにお勧めです。

環境

OS:Amazon Linux
WebServer : Apache2.4
DB:MySQL5.5
WordPress:4.5

導入方法

初期設定

導入方法についてそれぞれ以下のページを参照してください。
qiita.com

AWSユーザーは以下ページからNew Relicのユーザー登録をすることでStandard版が無料で使えます。
New Relic AWS | AWS Performance Monitoring | New Relic | New Relic Partner

モニタリング画面

以下にモニタリング画面を紹介します。

サーバリソース

CPU使用率やメモリなどの推移と内訳
f:id:cloudfish:20160501000357p:plain

PHPアプリケーション

PHPMySQLそれぞれのレスポンスタイム
f:id:cloudfish:20160501000525p:plain
アプリからのqueryの実行状況
f:id:cloudfish:20160501144335p:plain

MySQLプラグイン

コネクション数の推移やRead、Writeの割合。取得メトリクスを増やせばもっと色々表示できます。
f:id:cloudfish:20160501000440p:plain

カスタムダッシュボード

上記で必要なメトリクスを集めてダッシュボードのカスタマイズも可能です。
f:id:cloudfish:20160501000543p:plain

まとめ

各種のリソースの細かいところまで単に数字だけでなく綺麗にビジュアル化されているのですごく把握しやすくなっています。
カテゴリごとに分けられたリソース状況もカスタムダッシュボードを使うことで必要なメトリクスだけを設定して確認できます。また、プラグインも豊富に揃えられており様々なミドルウェアのメトリクスの取得が可能です。
特にAWSユーザーは無料で使える(データの保存期間に制限有り)ので是非使ってみて欲しいと思います。

EC2の鍵を入れ替える手順【cloudpack 大阪 BLOG】

別のアカウントからAMIを共有して起動した際に、OSによっては公開鍵をうまく変更できていないことがあるので、公開鍵を入れ替える方法についての備忘録

手順概要

  • EC2からrootボリュームをデタッチ
  • 別のEC2にrootボリュームをアタッチ
  • rootボリュームをマウント
  • 公開鍵の修正
  • rootボリュームをアンマウント
  • rootボリュームをデタッチ
  • 元のEC2にrootボリュームをアタッチ

手順詳細

① EC2からrootボリュームをデタッチ

まずは、対象のEC2からrootボリュームをデタッチしますが、再度アタッチする際にデバイス名が必要となるのでデバイス名を控えておきます。

デバイス名を確認
f:id:cloudfish:20160410170203p:plain

対象ボリュームをデタッチする
f:id:cloudfish:20160410170208p:plain

② 他のEC2に対象のボリュームをアタッチする

f:id:cloudfish:20160410170213p:plain

③ rootボリュームをマウント

別のEC2(起動していなかったら起動する)にログインし下記コマンドを実行する

ボリュームの確認

# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvdf    202:80   0  50G  0 disk
└─xvdf1 202:81   0  50G  0 part       ←対象ボリュームが認識されている
xvda1   202:1    0  50G  0 disk /

マウント用のディレクトリを作成する

# mkdir -p /mnt/ebs/0

マウントする

# mount /dev/xvdf1 /mnt/ebs/0

③ 対象ユーザーの公開鍵(authorized_key)を修正

ログインするための公開鍵をセットする

# vim /mnt/ebs/0/home/target_user/.ssh/authorized_keys

必要に応じてsshd_configを修正

# vim /mnt/ebs/0/etc/ssh/sshd_config

③ 対象ボリュームをアンマウント

# umount /mnt/ebs/0/

④ 対象ボリュームをデタッチ

手順①と同様にデタッチする

⑤ 元のEC2にアタッチ

元のインスタンスを選択し、①で控えておいたデバイス名をセットする
f:id:cloudfish:20160410175007p:plain

⑥ 起動して接続確認

元のインスタンスを起動して、対象の秘密鍵でログイン可能かを確認する

AWS Lambdaの簡易コマンド(lambda-controller)を作ってみた【cloudpack 大阪 BLOG】

やりたかったこと

外部ライブラリを使ってlambdaを開発しているとローカル環境で開発してアップロードしてAWSコンソールから実行という手間がすごく面倒だったので、開発時の簡単な実行確認については、ローカル環境のコマンドラインで全て完結できないかと思っていました。
AWSへのアップロードについては、lambda-uploaderを使っており、後はlambdaの実行がコマンドラインから簡単にできれば何とかなると思っていました。CLIは手軽に実行するには少し面倒なのと結果もjson形式となり見づらかったので、簡易実行できるコマンドを作ってみました。
ただし、まだまだ出来ることは限られているのと不具合もあると思うので今後改善予定です。

何ができるのか?

コマンドラインで以下の実行が可能です。

  • lambda関数の実行&ログ表示
  • lambda関数のリスト表示
  • lambda関数の詳細情報表示

インストール

pip install lambda-controller

使い方

前提としてaccesskey,secretkeyのcredentialへの設定が必要になります。

lambda関数の実行

lambda-controller --invoke(or -i) FunctionName
f:id:cloudfish:20160324091140p:plain

lambda関数のリスト表示

lambda-controller --detail(or -d) FunctionName
f:id:cloudfish:20160324090654p:plain

lambda関数の詳細情報表示

lambda-controller --list(or -l)
f:id:cloudfish:20160324091119p:plain

profileを指定して実行する場合

lambda-controller --profile=yourprofile --invoke(or --list or --detail)
f:id:cloudfish:20160324091759p:plain

Route53にドメインをコマンドラインで登録する【cloudpack 大阪 BLOG】

Route53にドメインを大量に登録する必要があったので、cliでのやり方を調べてみるとインプットにjsonファイルが必要なことがわかりました。ちょっと面倒だったので別の方法を探してみるとcli53というツールを見つけました。使い勝手はかなりいい感じだったので、インストール方法と使い方を紹介したいと思います。

インストール方法

ダウンロード

以下のリンクから自分の環境に応じて、パッケージをダウンロードしてください。
今回はMac版(cli53-mac-amd64)をダウンロードしました。
Release 0.7.0 · barnybug/cli53 · GitHub

インストール方

リネームして実行権を付与します。

# sudo mv cli53-mac-amd64 /usr/local/bin/cli53
# sudo chmod +x /usr/local/bin/cli53

使い方

事前に~/.aws/credentialsにシークレットキーとアクセスキーを設定しておいてください。
もしくは実行時に以下のように変数にセットしてください

aws_access_key_id = AKID1234567890
aws_secret_access_key = MY-SECRET-KEY
hosted zoneの作成
cli53 create example.com 
Aレコード

Zone Apex

cli53 rrcreate example.com '@ 300 A 192.168.1.2'

サブドメインがwww

cli53 rrcreate example.com 'www 60 A 192.168.0.1'
CNAMEレコード
cli53 rrcreate example.com 'mail CNAME ghs.googlehosted.com.'
MXレコード
cli53 rrcreate example.com '@ MX "10 192.168.0.1" "20 192.168.0.2"'

AWS LambdaでGmail APIの呼び出し 第2回【cloudpack 大阪 BLOG】

 前回でGmailAPIにアクセスする準備は整いましたので、引き続きLambdaでアクセスしてみたいと思います。

2.Lambdaの設定

① Lambda用プロジェクトの作成

プロジェクトのディレクトリを作成します。また、GmailAPIにアクセス用のライブラリなども利用するためvirtualenvで環境を分けておきます。

mkdir gmailapi_for_lambda
cd gmailapi_for_lambda/
virtualenv .venv
秘密鍵をp12からpemに変換

ダウンロードしたp12形式のファイルをpem形式に変換

openssl pkcs12 -in xxxxxxx.p12 -nodes -nocerts > privatekey.pem
③ Lambdaの作成

以下の4つのファイルを準備する。

gmailapi_for_lambda
├── gmail_access.py       ・・・ lambda関数本体
├── lambda.json             ・・・ labda-uploader用設定ファイル
├── privatekey.pem        ・・・ APIアクセス証明書
└── requirements.txt      ・・・ ライブラリリスト

gmail_access.py
GmailにアクセスするLambda関数本体となります。

#######################################################################################
# This is a sample to get the message list from Gmail
#######################################################################################
import httplib2
import imaplib,email,email.Header
import base64

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import SignedJwtAssertionCredentials
import pprint

def lambda_handler(event, context):
    try:
       main()
    except Exception:
       traceback.print_exc()
       sys.stderr.flush()
       sys.exit(1)

def main():
    pp = pprint.PrettyPrinter(indent=4)

    SERVICE_ACCOUNT_ID="your service account id"     ← サービスアカウントIDをセット
    KEY_SECRET="your secret key"                                 ← 秘密鍵のパスワード
    GMAIL_ACCOUNT="your gmail account"                  ← gmailのアカウント

    f = open("privatekey.pem","rb")
    key = f.read()
    f.close()

    credentials = SignedJwtAssertionCredentials(
        SERVICE_ACCOUNT_ID,
        key,
        scope="https://www.googleapis.com/auth/gmail.readonly",
        sub=GMAIL_ACCOUNT)
    http = httplib2.Http()

    http = credentials.authorize(http)
    service = build("gmail", "v1", http=http)

    message_list = service.users().messages().list(userId='me',
                                                    #labelIds=label_ids,
                                                    #pageToken=page_token,
                                                    maxResults=10,
                                                    q='is:unread'
                                                    ).execute()
    for message in message_list['messages']:
       message_detail = service.users().messages().get(userId='me', id=message['id'],format='metadata').execute()

       for element in message_detail['payload']['headers']:
          if element['name'] == 'Subject':
             print element['value']

if __name__ == '__main__':
        main()

◆lambda.json
lambda-uploder用の設定ファイルとなります。名称は任意です。roleは環境に合わせて変更してください。

{
  "name": "GmailTest",
  "description": "GmailTest",
  "region": "ap-northeast-1",
  "handler": "gmail_access.lambda_handler",
  "role": "arn:aws:iam::000000000000:role/lambda_basic_execution",
  "timeout": 300,
  "memory": 128
}

◆requirements.txt
利用するpythonのライブラリを記載します。Lambdaへのアップロード時にはこのファイルを参照してライブラリがアップロードファイルへ固められます。

pyCrypto
google-api-python-client

virtualenv環境をactive化する

source .py27/bin/activate

pythonライブラリのインストール

pip install -r requirements.txt

lambda-uploaderのインストール

pip install lambda-uploader

lambda-uploaderを実行
事前にaws configrueでアップロード先のアカウントのアクセスキー及びシークレットキーをセットしておく

lambda-uploader 
④ 動作確認

Gmailに下記のサンプルデータを準備しました。
f:id:cloudfish:20160208230400p:plain

アップロードしたLambda関数を選択
f:id:cloudfish:20160208230413p:plain

Testボタンで実行します。
f:id:cloudfish:20160208230422p:plain

ログに取得したメールのタイトルが出力されました。
f:id:cloudfish:20160208230426p:plain


これでLambdaからGmailにアクセスできるようになりました。同様の方法で他のAPIへのアクセスもできるはずなので、色々と用途が広がりそうです。
gmailapi-explorerが、Web上で実行できかつコードを生成してくれるのでかなり便利だと思いました。
今回のサンプルはGitHub - cloudfish7/gmailapi_for_lambdaにアップしています。

AWS LambdaでGmail APIの呼び出し 第1回【cloudpack 大阪 BLOG】

 AWS LambdaからGmailAPIを呼び出したいと思い方法を調べてみました。当初はGmailAPIにアクセスするためのQuickstartが用意されていたため簡単にできるかと思っていました。が、サンプルがOAuth認証のみとなっていました。OAuthではプログラム実行時に手動で認証になるためLambdaではサービスアカウントを使用する必要があります。このあたりの使い方がよくわからずがっつりハマりました。また、Lambdaでもしっかり躓きなかなか大変でしたが、何とかAPIを呼び出すところまで漕ぎ着けたので手順をまとめておきたいと思います。今回は長くなりそうなので2回に分けたいと思います。

手順

1.GmailAPIの設定(第1回)

 ① プロジェクトの作成
 ② APIの有効化
 ③ サービスアカウントの作成

2.Lambdaの設定(第2回)

 ① Lambda用プロジェクトの作成
 ② 秘密鍵をp12からpemに変換
 ③ Lambdaの作成
 ④ 動作確認

開発環境

 Amazon Linux AMI release 2015.09
 Python v2.7.10
 google-api-python-client v1.4.2
 pycrypto v2.6.1
 lambda-uploader v0.5.0

1.GmailAPIの設定

① プロジェクトの作成

前提としてGmailの2段階認証を有効にしておいてください。まずはGoogle Developer Consoleにアクセスします。
HOME画面にアクセスし、「プロジェクトの作成」を選択。初めての場合はプロジェクトの作成画面になるかもしれません。
f:id:cloudfish:20160208013126p:plain

プロジェクト名に任意の名前を入力し、作成をクリック。
f:id:cloudfish:20160208013131p:plain

APIの有効化

デフォルトではGMailAPIは無効化されていますので有効にします。
f:id:cloudfish:20160208013134p:plain

GmailAPIをクリック
f:id:cloudfish:20160208013158p:plain

APIを有効にするをクリック。これでGmailAPIが有効化されました。
f:id:cloudfish:20160208013210p:plain

③ サービスアカウントの作成

Lambdaからアクセスするためのアカウントを作成します。サーバからアクセスする場合はOAuthクライアントIDでも可能ですが、認証が必要となるためサービスアカウントを作成します。左ペインの認証情報を選択し、新しい認証情報クリック。
f:id:cloudfish:20160208013219p:plain

サービスアカウントキーを選択。
f:id:cloudfish:20160208013224p:plain

任意の名前を入力します。キーのタイプP12を選択し作成をクリック。
f:id:cloudfish:20160208013229p:plain

鍵が自動的にダウンロードされますので保管しておいてください。またパスワードも控えておいてください。
余談ですが、たまたまSafariでこのページを開いていたのですが自動でダウンロードされませんでした。
f:id:cloudfish:20160208013233p:plain

サービスアカウントの管理をクリック
f:id:cloudfish:20160208013236p:plain

GmailAPIにアクセスする際はこのメールアドレス(サービスアカウントID)とダウンロードした鍵を使用して認証を行います。
f:id:cloudfish:20160208013240p:plain

これで準備が整いましたので、次回はLambdaでGmailアクセスを行いたいと思います。

AWS IOTでDynamoDBへ登録する【cloudpack 大阪 BLOG】

仕事でAWS IOTを使って簡単なデモを作成しました。センサーから送信されたデータは、IOTからDynamoDBへ直接連携できる機能が用意されていたため、DynamoDBへ登録することにしました。今回はその手順を残しておきます。

手順(概要)

1.テーブル作成
2. AWS IOTの設定
3. 動作確認

1.テーブル作成

AWS IOT連携する場合はソートキーが必須になるのでソートキーも作成してください。

f:id:cloudfish:20160124160343p:plain

2.AWS IOTの設定

①thingの作成

AWS IOT上で管理するデバイスの名前を作成します。
f:id:cloudfish:20160121115311p:plain

②ruleの作成

IOTで受け取ったデータをどのように処理するかのルールを作成します。
f:id:cloudfish:20160124162649j:plain
Create a ruleをクリック

f:id:cloudfish:20160124164411j:plain
f:id:cloudfish:20160124164422j:plain


③証明書の取得

認証用の証明書を取得します
f:id:cloudfish:20160205233115p:plain

秘密鍵、証明書等をダウンロードします。
また使いたいSDKを選択し、「Confirm & start connect」を選択します。
f:id:cloudfish:20160205233131p:plain

以下のページが表示されSDKのダウンロードができます。
f:id:cloudfish:20160205234249p:plain

また、下記ページからroot証明書をダウンロードします。
https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem

3. 動作確認

動作確認はnodeで1回だけpublishするサンプルを作成しました。テストだけならaws cliでも確認可能です。
aws-iot-device-sdk-js/examples以下に適当な名前で下記プログラムを作成します。
また同じディレクトリにcertsディレクトリを作成し上記で取得した証明書を格納しておきます

const deviceModule   = require('..').device;
const cmdLineProcess = require('./lib/cmdline');

const device = deviceModule({
  keyPath: './certs/private.pem.key',
  certPath: './certs/certificate.pem.crt',
  caPath: './certs/root-CA.crt',
  clientId: '1',
  region: 'ap-northeast-1',
  reconnectPeriod:10
});

var thingName = 'iot_test'
device.subscribe(thingName);

var put_data = {};
var data = new Array();


// データ送信
var now = new Date();
var yyyymmdd = now.getFullYear()+
           ( "0"+( now.getMonth()+1 ) ).slice(-2)+
           ( "0"+now.getDate() ).slice(-2);

var hhmmss = ("0" + now.getHours()).slice(-2)  + ("0" + now.getMinutes()).slice(-2) + ("0" + now.getSeconds()).slice(-2) + ("00" + now.getMilliseconds()).slice(-3);
put_data = {
              date: yyyymmdd,
              time : hhmmss,
              value :Math.floor( Math.random() * 11 )
           };


device.publish(thingName, JSON.stringify(put_data));

console.log( JSON.stringify(put_data));
console.log( 'publish');


次のコマンドで実行します。

node put_data.js


publishしたデータ送信データが登録されましたね。
f:id:cloudfish:20160206000916p:plain

今回初めてDynamoDBを使ったのでよく分からず、IOTの設定のところでつまづきました。
また、ルール作成のところでPayload fieldにDynamoに登録したいフィールドを入力しましたが、
全項目が登録されてしまい特定のフィールドだけ選択して登録ということが出来ませんでした。ここはもう少し調べてみたいと思います。