AWS Distro for OpenTelemetryというものがあることを知りました。これを使うとメトリクスとトレース情報が簡単に収集できるようです。Javaのアプリケーションのメトリクスやトレースをどのように収集するのか興味がありましたので、実際に試してみました。 今回試したソースコードはGitHubに格納しています。
「CloudWatch」タグの記事が4件件あります
全てのタグを見るPrometheusとGrafanaでRaspberry Piを監視
過去にQiitaに投稿した内容のアーカイブです。
Raspberry PiにPrometheusとGrafanaをインストールして、Raspberry Pi自身を監視してみました。
環境
Raspberry Pi 3 Raspberry Pi OS(2020-05-27版)
Prometheusのインストール
Raspberry Piの公式リポジトリから導入できます。
prometheus
がPrometheus本体、prometheus-node-exporter
はOSのメトリクス情報を取得するものです。
sudo apt install prometheus prometheus-node-exporter
インストールが完了すると、すでにサービスとして起動した状態となります。 2020/6/27時点でインストールされたバージョンは以下の通り。最新バージョンはPrometheusが2.19.2、Node exporterが1.0.1なので少し古そうですね。
pi@raspberrypi:~ $ prometheus --version
prometheus, version 2.7.1+ds (branch: debian/sid, revision: 2.7.1+ds-3)
build user: [email protected]
build date: 20190210-18:10:02
go version: go1.11.5
pi@raspberrypi:~ $ prometheus-node-exporter --version
node_exporter, version 0.17.0+ds (branch: debian/sid, revision: 0.17.0+ds-3)
build user: [email protected]
build date: 20190131-17:33:42
go version: go1.11.5
Prometheusの動作確認
Raspberry Piからhttp://localhost:9090/
、または他のPCからhttp://raspberrypi.local:9090/
にアクセスすると、PrometheusのWeb画面にアクセスできます。
タブをGraph
に切り替えて、メトリクスを選ぶとグラフが表示されます。
すごいですね。簡単ですね。 凝ったグラフを作りたいときは、Grafanaの出番です。
Grafanaのインストール
Grafanaは公式リポジトリでは提供されていないようですが、Grafanaの公式サイトでARM向けのdebパッケージが提供されています。
wget https://dl.grafana.com/oss/release/grafana_7.0.4_armhf.deb
sudo apt install ./grafana_7.0.4_armhf.deb
Grafanaはインストールしただけでは起動しないようです。
sudo systemctl status grafana-server.service
Grafanaの動作確認
Grafanaは3000
ポートで起動しますので、http://localhost:3000/
またはhttp://raspberrypi.local:3000/
でアクセスできます。
初期ユーザーはadmin
、パスワードもadmin
です。
ログイン後はこんな感じ。
データソースの作成
GrafanaでPrometheusのデータを扱うため、データソースの設定を行います。
- 左メニューの
Configuration
(ギアアイコン)からData Sources
を選択します。 Add Data source
を選択します。Prometheus
の右のSelect
ボタンを押します。- URLに
http://localhost:9090
と入力し、その他はデフォルトのままでSave & Test
ボタンを押します。
これでデータソースの設定が完了です。 続けてダッシュボードを作成します。
ダッシュボードの作成
ダッシュボード画面は一から作ることもできますが、すでに作成済みのダッシュボードが公式サイトで公開されています。オフィシャルなものからコミュニティのものまでたくさんあります。 https://grafana.com/grafana/dashboards
ダッシュボードにはそれぞれIDがあり、IDを登録することで、自分のGrafanaで使用することができます。
- 左メニューの
Dashboards
(四角が4つのアイコン)から、Manage
を選択します。 - 画面右端の
Import
を選択します。 3. 画面中央の入力欄にID(今回は11074)を入力して、Load
ボタンを押します。ダッシュボードにはそれぞれIDがあり、IDを登録することで、自分のGrafanaで使用することができます。 - ダッシュボードの情報が表示されます。
Prometheus Data Source
のところで、データソースを選択し、画面下のImport
ボタンを押します。
これでダッシュボードができました。すっげー。
CloudWatchの監視
GrafanaはデータソースとしてCloudWatchにも対応してます。 設定画面はこんな感じ こちらもダッシュボードを検索して追加すれば、簡単に監視ができそうです。 (いい感じの監視対象がなかったのでキャプチャはありません。。。)
EC2のダッシュボードのリンクを貼っておきます。 https://grafana.com/grafana/dashboards/11265
Lambdaのログをいい感じにS3に保存し続ける方法
過去にQiitaに投稿した内容のアーカイブです。
CloudWatch Logsに出力されたLambdaのログをS3に保管する方法です。
CloudWatch Logsのサブスクリプションという機能でログをKinesis Data Firehoseに送信します。 そのままS3に出力すると複数のログが1行に並ぶ形になってしまいますが、Kinesis Data Firehoseのデータ変換機能で改行を加えることで解決します。
こんな感じです。
S3バケットの作成
ログを出力するバケットを作成します。今回はlog-backup-xxxxx
とします。
データ変換用Lambdaの作成
データ変換用LambdaはAWSが設計図を用意してくれているので簡単に作成できます。 マネジメントコンソールでLambda関数を作成します。
項目 | 選択 | 説明 |
---|---|---|
作成方法 | 設計図の使用 | |
設計図 | kinesis-firehose-cloudwatch-logs-processor | Node.js版。Python2.7版のkinesis-firehose-cloudwatch-logs-processor-pythonもあります |
関数名 | kinesis-firehose-cloudwatch-logs-processor | 任意 |
実行ロール | 基本的なLambdaアクセス権限で新しいロールを作成する |
ソース中にコメントに以下の記載があり、どのような形式のログが渡ってくるかがわかります。
/*
For processing data sent to Firehose by Cloudwatch Logs subscription filters.
Cloudwatch Logs sends to Firehose records that look like this:
{
"messageType": "DATA_MESSAGE",
"owner": "123456789012",
"logGroup": "log_group_name",
"logStream": "log_stream_name",
"subscriptionFilters": [
"subscription_filter_name"
],
"logEvents": [
{
"id": "01234567890123456789012345678901234567890123456789012345",
"timestamp": 1510109208016,
"message": "log message 1"
},
{
"id": "01234567890123456789012345678901234567890123456789012345",
"timestamp": 1510109208017,
"message": "log message 2"
}
...
]
}
The data is additionally compressed with GZIP.
The code below will:
1) Gunzip the data
2) Parse the json
3) Set the result to ProcessingFailed for any record whose messageType is not DATA_MESSAGE, thus redirecting them to the
processing error output. Such records do not contain any log events. You can modify the code to set the result to
Dropped instead to get rid of these records completely.
4) For records whose messageType is DATA_MESSAGE, extract the individual log events from the logEvents field, and pass
each one to the transformLogEvent method. You can modify the transformLogEvent method to perform custom
transformations on the log events.
5) Concatenate the result from (4) together and set the result as the data of the record returned to Firehose. Note that
this step will not add any delimiters. Delimiters should be appended by the logic within the transformLogEvent
method.
6) Any additional records which exceed 6MB will be re-ingested back into Firehose.
*/
処理手順も色々ありそうですが、そのあたりはすでに実装済みなので、変換する形式を変更したい場合はtransformLogEvent
関数を修正するだけです。
設計図での実装は、付加情報は全部除外して、ログのメッセージに改行を付与して出力しています。
/**
* logEvent has this format:
*
* {
* "id": "01234567890123456789012345678901234567890123456789012345",
* "timestamp": 1510109208016,
* "message": "log message 1"
* }
*
* The default implementation below just extracts the message and appends a newline to it.
*
* The result must be returned in a Promise.
*/
function transformLogEvent(logEvent) {
return Promise.resolve(`${logEvent.message}\n`);
}
例えば、logEvent
の内容をすべて出力し改行を付与する場合は、以下の様になると思います。
function transformLogEvent(logEvent) {
return Promise.resolve(`${JSON.stringify(logEvent)}\n`);
}
また、Amazon Kinesis Data Firehose CloudWatch Logs Processor
というテストイベントも用意されているので、マネジメントコンソールで簡単にテストができます。
最後に、Lambdaのタイムアウトを1分以上にしておきましょう。
Kinesis Data Firehoseのストリームを作成
マネジメントコンソールで作成します。
項目 | 選択 | 説明 |
---|---|---|
Delivery stream name | CloudWatchLogs-to-S3 | 任意 |
Choose a source | ||
source | Direct PUT or other sources | |
---次のページ--- | ||
Transform source records with AWS Lambda | ||
Record transformation | Enabled | |
Lambda function | kinesis-firehose-cloudwatch-logs-processor | 作成したLambda |
Lambda function version | $LATEST | |
Convert record format | ||
Record format conversion | Disabled | |
---次のページ--- | ||
Select a destination | ||
Destination | Amazon S3 | |
S3 destination | ||
S3 destination | log-backup-xxxxx | 作成したバケット |
S3 prefix | logs/ | |
S3 error prefix | error/ | |
S3 backup | ||
Source record S3 backup | Disabled | |
S3 buffer conditions | ||
Buffer size | 5MB | デフォルト値 |
Buffer interval | 300seconds | デフォルト値 |
S3 compression and encryption | ||
S3 compression | Disabled | |
S3 encryption | Disabled | |
Error logging | ||
Error logging | Enabled | |
Permissions | ||
IAM role | Create new or choose | 新しくIAMロールを作成するといい感じにアクセス権限を付与してくれます |
CloudWatch Logsに付与するIAMロールを作成
このあとの手順で作成するCloudWatch Logsのサブスクリプションフィルターに、Firehoseにアクセスする権限が必要なので、IAMロールを作成します。 ただ、マネジメントコンソール上からは、CloudWatch Logsに付与するIAMロールはそのままでは作れないので、以下の手順で作成します。
まずはマネジメントコンソールでIAMロールを作成します。
項目 | 選択 | 説明 |
---|---|---|
信頼されたエンティティの種類を選択 | AWSサービス | |
このロールを使用するサービスを選択 | EC2 | |
Attach アクセス権限ポリシー | なし | 次の手順で付与します |
ロール名 | CWLtoKinesisFirehoseRole | |
ロールの説明 | 削除 | 説明がEC2になってるので削除しておく |
次にIAMポリシーを作成します。
項目 | 選択 | 説明 |
---|---|---|
サービス1 | ||
サービス | Firehose | |
アクション | すべてのFirehoseアクション | |
リソース | arn:aws:firehose:ap-northeast-1:[アカウントID]:deliverystream/CloudWatchLogs-to-S3 | 作成したFirehoseの配信ストリームのARN |
サービス2 | ||
サービス | IAM | |
アクション | PassRole | |
リソース | arn:aws:iam::[アカウントID]:role/CWLtoKinesisFirehoseRole | 作成したIAMロールのARN |
---次のページ--- |
| ポリシーの確認 | 名前 | Permissions-Policy-For-CWL |
再度IAMロールの編集画面に戻り、CWLtoKinesisFirehoseRoleロールにPermissions-Policy-For-CWLポリシーをアタッチします。
最後にCWLtoKinesisFirehoseRoleロールの信頼関係タブの信頼関係の編集
をクリック。"Service": "ec2.amazonaws.com"
の部分を"Service": "logs.ap-northeast-1.amazonaws.com"
に変更し、保存します。
CloudWatch Logsサブスクリプションフィルターの作成
マネジメントコンソールからは作成できないようですので、CLIで作成します。
パラメータ(キー) | パラメータ(値) | 説明 |
---|---|---|
--log-group-name | /aws/lambda/xxxxxx | サブスクリプションフィルターを追加したいロググループ名 |
--filter-name | Logs-to-Firehose | 任意 |
--filter-pattern | "" | フィルターせず、全ての場合 |
--destination-arn | arn:aws:firehose:ap-northeast-1:[アカウントID]:deliverystream/CloudWatchLogs-to-S3 | 作成したFirehoseの配信ストリームのARN |
--role-arn | arn:aws:iam::[アカウントID]:role/CWLtoKinesisFirehoseRole | 作成したIAMロールのARN |
aws logs put-subscription-filter --log-group-name [ロググループ名] --filter-name Logs-to-Firehose --filter-pattern "" --destination-arn arn:aws:firehose:ap-northeast-1:[アカウントID]:deliverystream/CloudWatchLogs-to-S3 --role-arn arn:aws:iam::[アカウントID]:role/CWLtoKinesisFirehoseRole
完成
これで無事にS3にCloudWatchLogsがS3に保存されます。 GlueやAthenaでもクエリーがかけられそうです。
参考
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#FirehoseExample https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/data-transformation.html https://docs.aws.amazon.com/cli/latest/reference/logs/put-subscription-filter.html
Raspberry PiをAirPrintサーバーにして親孝行する
過去にQiitaに投稿した内容のアーカイブです。
私の両親は共にiPhoneユーザーですが、残念ながらプリンターがAirPrintに対応していません。 そのため、Raspberry PiをAirPrintサーバーにしてプレゼントして親孝行をする作戦です。
準備するもの
- Raspberry Pi 3
- ケース
- 電源
- microSDカード
OSの選択
無難にRaspbianを選択しました。 本日時点の最新バージョンはこれでした。
https://www.raspberrypi.org/downloads/raspbian/
RASPBIAN JESSIE WITH PIXEL
Version:January 2017
Release date:2017-01-11
OSインストール
microSDカードにインストールします。
Windowsの場合だと、「DD for Windows」を使う方法が一般的ですが、変わった方法として、「Chromebook リカバリ ユーティリティ」を使った方法を紹介します。
Chromebook リカバリ ユーティリティ
名前の通り、Chromebookをリカバリするときに使うツールです。 Chromeアプリですので、Chrome ウェブストアからインストールしてください。
インストール手順
- RaspbianのOSイメージをダウンロード、展開します。
- Chromebook リカバリ ユーティリティを起動します。
- 画面右上のギアアイコンから「ローカルイメージを使用」を選択します。
- OSイメージファイルを選択する。 ※拡張子「*.bin」でフィルタリングされているので、注意
- 次々進んでインストールを完了させます。
SSHの有効化
最近のRaspbianはSSHがデフォルトで無効になっているようです。 (リリースノートによると2016/11/25から)
bootパーティションにsshというファイルを作成すると有効にできますので、 ファイル作成します。
WindowsのエクスプローラーでSDカードのドライブを開き、
右クリック→新規作成→「テキストドキュメント」
ファイル名を「ssh」に変更
起動!
microSDカードをRaspberry Piに差し替え、電源を入れます。 Wi-Fiの設定はまだなので、一旦は有線Lanも接続します。
ログイン
SSHでログインします。
Windowsで名前解決ができない場合は、iTunesかBonjour Print Services をインストールしましょう。 https://support.apple.com/kb/DL999?locale=ja_JP&viewlocale=ja_JP
設定
Raspberry Piの初期設定です。設定の詳細は他の方の投稿を参考にしてください。
sudo raspi-config
変更したもの
- パーティションの拡張
- ロケールを「en_US.UTF-8」と「 ja_JP.UTF-8」に変更。
- VNCの有効化
インストール&設定
OSアップデート
まずは手動で更新します。
sudo apt-get update # 取得元からパッケージインデックスファイルの再同期を行うのに使用します。
sudo apt-get upgrade # 現在システムにインストールされている全パッケージの最新バージョンを、/etc/apt/sources.list に列挙した取得元からインストールするのに使用します。
sudo apt-get dist-upgrade # upgrade の機能に加え、新バージョンのパッケージに対する依存関係の変更を知的に操作します。
OS自動更新設定
Windows Update風に自動更新する設定をします。 https://wiki.debian.org/UnattendedUpgrades
sudo apt-get install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
ウイルス対策ソフト
ClamAV https://www.clamav.net/
sudo apt-get install clamav
このあとに freshclam
を実行しようとか、root権限にしようとか手順がよく紹介されていますが、どうも、勝手にサービス起動し、ウイルス定義ファイルの更新もしてくれているような。。
service clamav-freshclam status
● clamav-freshclam.service - ClamAV virus database updater
Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled)
Active: active (running) since 火 2017-02-28 22:41:39 JST; 17min ago
Docs: man:freshclam(1)
man:freshclam.conf(5)
http://www.clamav.net/lang/en/doc/
Main PID: 7190 (freshclam)
CGroup: /system.slice/clamav-freshclam.service
└─7190 /usr/bin/freshclam -d --foreground=true
ログをAmazon CloudWatchに転送
急にAWSが出てきますが、今回はRaspberry Piを遠隔地(車で30分先の実家ですが)に配置するため、ログをAWSに転送したいと思います。 IAMユーザーの作成などは端折ってます。
CloudWatch Logs エージェント http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.html
curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
sudo python ./awslogs-agent-setup.py --region ap-northeast-1
とりあえず、 /var/log/auth.logのログをアップロードしてみます。 何のログだろう。
Launching interactive setup of CloudWatch Logs agent ...
Step 1 of 5: Installing pip ...DONE
Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE
Step 3 of 5: Configuring AWS CLI ...
AWS Access Key ID [None]: 「AWS Access Key ID」を入力
AWS Secret Access Key [None]: 「AWS Secret Access Key」を入力
Default region name [ap-northeast-1]:
Default output format [None]:
Step 4 of 5: Configuring the CloudWatch Logs Agent ...
Path of log file to upload [/var/log/syslog]: /var/log/auth.log
Destination Log Group name [/var/log/auth.log]:
Choose Log Stream name:
1. Use EC2 instance id.
2. Use hostname.
3. Custom.
Enter choice [1]: 2
Choose Log Event timestamp format:
1. %b %d %H:%M:%S (Dec 31 23:59:59)
2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36)
3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54)
4. Custom
Enter choice [1]: 1
Choose initial position of upload:
1. From start of file.
2. From end of file.
Enter choice [1]: 2
More log files to configure? [Y]: N
Step 5 of 5: Setting up agent as a daemon ...DONE
------------------------------------------------------
- Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
- You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logs:
- You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
- To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
- You can rerun interactive setup using 'sudo python ./awslogs-agent-setup.py --region ap-northeast-1 --only-generate-config'
------------------------------------------------------
なぜかサービスが有効にならないので、自分でサービス有効化&起動
sudo systemctl enable awslogs
sudo service awslogs start
最終的にこんな感じにしました。
sudo cat /var/awslogs/etc/awslogs.conf
[/var/log/auth.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/auth.log
buffer_duration = 5000
log_stream_name = {hostname}
initial_position = end_of_file
log_group_name = /var/log/auth.log
[/var/log/clamav/freshclam.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/clamav/freshclam.log
buffer_duration = 5000
log_stream_name = {hostname}
initial_position = end_of_file
log_group_name = /var/log/clamav/freshclam.log
[/var/log/cups/error_log]
datetime_format = %d/%b/%Y:%H:%M:%S %z
file = /var/log/cups/error_log
buffer_duration = 5000
log_stream_name = {hostname}
initial_position = end_of_file
log_group_name = /var/log/cups/error_log
[/var/log/unattended-upgrades/unattended-upgrades.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/unattended-upgrades/unattended-upgrades.log
buffer_duration = 5000
log_stream_name = {hostname}
initial_position = end_of_file
log_group_name = /var/log/unattended-upgrades/unattended-upgrades.log
プリントサーバー
本題です。
sudo apt-get install cups
sudo apt-get install printer-driver-all # プリンタードライバー
プリンター管理ができるようにグループ追加
sudo gpasswd -a pi lpadmin
VNCでログインし、Chromiumブラウザで https://localhost:631 にアクセスします。
VNCもChromeアプリで提供されています。 https://chrome.google.com/webstore/detail/vnc%C2%AE-viewer-for-google-ch/iabmpiboiopbgfabjmgeedhcmjenhbla
怒られても気にしない。
詳細設定 → localhostにアクセスする(安全ではありません) をクリック
何だこの解像度は。 設定を進めましょう。
- [管理]タブを選択
- [サーバー]→[サーバー設定]
- 「このシステムに接続されているプリンターを共有」にチェック
- 「リモート管理を許可」にチェック
- 「所有者以外のユーザーにもジョブのキャンセルを許可」にチェック
- 「設定の変更」ボタンをクリック
- ログインダイアログが出たら、piユーザーのアカウント/パスワードを入力
これで他のパソコンからもアクセスできます。
- [管理]タブを選択
- [プリンター]→[プリンターの追加]ボタンクリック
- 設定したいプリンターを選択
- 「このプリンターを共有する」にチェック
今回は実家に設置するので印刷に失敗したら、ジョブをキャンセルするようにします。 「デフォルトオプション」の中の「ポリシー」を選び、エラーポリシーを「abort-job」にします。
その他
最終的にはVNCもSSHも無効にしようかと計画中。 そしてTeamViewerをインストールしようかな。 https://www.teamviewer.com/ja/download/linux/
参考サイト
http://qiita.com/torch32171/items/c816acd5afa45fddabfe http://qiita.com/tomiyan/items/77c7794074f9445ea548 http://qiita.com/ryosy383/items/ac450750e9419b5bcf75 http://orangain.hatenablog.com/entry/unattended-upgrades http://l-chika.hatenablog.com/entry/2017/01/27/190853