NewRelicでEC2をモニタリング【cloudpack 大阪 BLOG】
NewRelicでEC2にWordPressをセットアップしてモニタリングしてみました。リソース状況が視覚的によく分かるので、パフォーマンス分析に使いやすいです。また、単にCPU使用率だけでなくプロセスごとのCPU使用率・メモリの推移やアプリケーションのレスポンスタイムの内訳などもグラフで表示されておりシステムのボトルネックを調査するのにお勧めです。
導入方法
初期設定
導入方法についてそれぞれ以下のページを参照してください。
qiita.com
AWSユーザーは以下ページからNew Relicのユーザー登録をすることでStandard版が無料で使えます。
New Relic AWS | AWS Performance Monitoring | New Relic | New Relic Partner
EC2の鍵を入れ替える手順【cloudpack 大阪 BLOG】
別のアカウントからAMIを共有して起動した際に、OSによっては公開鍵をうまく変更できていないことがあるので、公開鍵を入れ替える方法についての備忘録
手順概要
- EC2からrootボリュームをデタッチ
- 別のEC2にrootボリュームをアタッチ
- rootボリュームをマウント
- 公開鍵の修正
- rootボリュームをアンマウント
- rootボリュームをデタッチ
- 元のEC2にrootボリュームをアタッチ
手順詳細
① EC2からrootボリュームをデタッチ
まずは、対象のEC2からrootボリュームをデタッチしますが、再度アタッチする際にデバイス名が必要となるのでデバイス名を控えておきます。
デバイス名を確認
対象ボリュームをデタッチする
② 他のEC2に対象のボリュームをアタッチする
③ 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にアタッチ
元のインスタンスを選択し、①で控えておいたデバイス名をセットする
AWS Lambdaの簡易コマンド(lambda-controller)を作ってみた【cloudpack 大阪 BLOG】
やりたかったこと
外部ライブラリを使ってlambdaを開発しているとローカル環境で開発してアップロードしてAWSコンソールから実行という手間がすごく面倒だったので、開発時の簡単な実行確認については、ローカル環境のコマンドラインで全て完結できないかと思っていました。
AWSへのアップロードについては、lambda-uploaderを使っており、後はlambdaの実行がコマンドラインから簡単にできれば何とかなると思っていました。CLIは手軽に実行するには少し面倒なのと結果もjson形式となり見づらかったので、簡易実行できるコマンドを作ってみました。
ただし、まだまだ出来ることは限られているのと不具合もあると思うので今後改善予定です。
インストール
pip install lambda-controller
使い方
前提としてaccesskey,secretkeyのcredentialへの設定が必要になります。
lambda関数の実行
lambda-controller --invoke(or -i) FunctionName
lambda関数のリスト表示
lambda-controller --detail(or -d) FunctionName
lambda関数の詳細情報表示
lambda-controller --list(or -l)
profileを指定して実行する場合
lambda-controller --profile=yourprofile --invoke(or --list or --detail)
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
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画面にアクセスし、「プロジェクトの作成」を選択。初めての場合はプロジェクトの作成画面になるかもしれません。
プロジェクト名に任意の名前を入力し、作成をクリック。
③ サービスアカウントの作成
Lambdaからアクセスするためのアカウントを作成します。サーバからアクセスする場合はOAuthクライアントIDでも可能ですが、認証が必要となるためサービスアカウントを作成します。左ペインの認証情報を選択し、新しい認証情報クリック。
サービスアカウントキーを選択。
任意の名前を入力します。キーのタイプP12を選択し作成をクリック。
鍵が自動的にダウンロードされますので保管しておいてください。またパスワードも控えておいてください。
余談ですが、たまたまSafariでこのページを開いていたのですが自動でダウンロードされませんでした。
サービスアカウントの管理をクリック
GmailAPIにアクセスする際はこのメールアドレス(サービスアカウントID)とダウンロードした鍵を使用して認証を行います。
これで準備が整いましたので、次回はLambdaでGmailアクセスを行いたいと思います。
AWS IOTでDynamoDBへ登録する【cloudpack 大阪 BLOG】
仕事でAWS IOTを使って簡単なデモを作成しました。センサーから送信されたデータは、IOTからDynamoDBへ直接連携できる機能が用意されていたため、DynamoDBへ登録することにしました。今回はその手順を残しておきます。
手順(概要)
1.テーブル作成
2. AWS IOTの設定
3. 動作確認
2.AWS IOTの設定
①thingの作成
AWS IOT上で管理するデバイスの名前を作成します。
②ruleの作成
IOTで受け取ったデータをどのように処理するかのルールを作成します。
Create a ruleをクリック
③証明書の取得
認証用の証明書を取得します
秘密鍵、証明書等をダウンロードします。
また使いたいSDKを選択し、「Confirm & start connect」を選択します。
以下のページが表示されSDKのダウンロードができます。
また、下記ページから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したデータ送信データが登録されましたね。
今回初めてDynamoDBを使ったのでよく分からず、IOTの設定のところでつまづきました。
また、ルール作成のところでPayload fieldにDynamoに登録したいフィールドを入力しましたが、
全項目が登録されてしまい特定のフィールドだけ選択して登録ということが出来ませんでした。ここはもう少し調べてみたいと思います。