メインコンテンツまでスキップ

「CloudWatch」タグの記事が4件件あります

全てのタグを見る

· 約8分
moritalous

AWS Distro for OpenTelemetryというものがあることを知りました。これを使うとメトリクスとトレース情報が簡単に収集できるようです。Javaのアプリケーションのメトリクスやトレースをどのように収集するのか興味がありましたので、実際に試してみました。 今回試したソースコードはGitHubに格納しています。

· 約5分
moritalous
お知らせ

過去に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画面にアクセスできます。

raspberrypi.local_9090_graph(iPad).png

タブをGraphに切り替えて、メトリクスを選ぶとグラフが表示されます。

raspberrypi.local_9090_graph(iPad) (1).png

すごいですね。簡単ですね。 凝ったグラフを作りたいときは、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/でアクセスできます。

raspberrypi.local_3000_login(iPad).png

初期ユーザーはadmin、パスワードもadminです。 ログイン後はこんな感じ。

raspberrypi.local_3000_(iPad).png

データソースの作成

GrafanaでPrometheusのデータを扱うため、データソースの設定を行います。

  1. 左メニューのConfiguration(ギアアイコン)からData Sourcesを選択します。 raspberrypi.local_3000_(iPad) (5).png
  2. Add Data sourceを選択します。 raspberrypi.local_3000_(iPad) (6).png
  3. Prometheusの右のSelectボタンを押します。 raspberrypi.local_3000_(iPad) (7).png
  4. URLにhttp://localhost:9090と入力し、その他はデフォルトのままでSave & Testボタンを押します。 raspberrypi.local_3000_(iPad) (8).png

これでデータソースの設定が完了です。 続けてダッシュボードを作成します。

ダッシュボードの作成

ダッシュボード画面は一から作ることもできますが、すでに作成済みのダッシュボードが公式サイトで公開されています。オフィシャルなものからコミュニティのものまでたくさんあります。 https://grafana.com/grafana/dashboards

ダッシュボードにはそれぞれIDがあり、IDを登録することで、自分のGrafanaで使用することができます。

  1. 左メニューのDashboards(四角が4つのアイコン)から、Manageを選択します。 raspberrypi.local_3000_(iPad) (1).png
  2. 画面右端のImportを選択します。 raspberrypi.local_3000_(iPad) (2).png 3. 画面中央の入力欄にID(今回は11074)を入力して、Loadボタンを押します。ダッシュボードにはそれぞれIDがあり、IDを登録することで、自分のGrafanaで使用することができます。 raspberrypi.local_3000_(iPad) (3).png
  3. ダッシュボードの情報が表示されます。Prometheus Data Sourceのところで、データソースを選択し、画面下のImportボタンを押します。 raspberrypi.local_3000_(iPad) (9).png

これでダッシュボードができました。すっげー。

raspberrypi.local_3000_(iPad) (15).png

CloudWatchの監視

GrafanaはデータソースとしてCloudWatchにも対応してます。 raspberrypi.local_3000_(iPad) (13).png 設定画面はこんな感じ raspberrypi.local_3000_(iPad) (14).png こちらもダッシュボードを検索して追加すれば、簡単に監視ができそうです。 (いい感じの監視対象がなかったのでキャプチャはありません。。。)

EC2のダッシュボードのリンクを貼っておきます。 https://grafana.com/grafana/dashboards/11265

· 約8分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

CloudWatch Logsに出力されたLambdaのログをS3に保管する方法です。

CloudWatch Logsのサブスクリプションという機能でログをKinesis Data Firehoseに送信します。 そのままS3に出力すると複数のログが1行に並ぶ形になってしまいますが、Kinesis Data Firehoseのデータ変換機能で改行を加えることで解決します。

こんな感じです。

名称未設定ファイル.png

S3バケットの作成

ログを出力するバケットを作成します。今回はlog-backup-xxxxxとします。

データ変換用Lambdaの作成

データ変換用LambdaはAWSが設計図を用意してくれているので簡単に作成できます。 マネジメントコンソールでLambda関数を作成します。

項目選択説明
作成方法設計図の使用
設計図kinesis-firehose-cloudwatch-logs-processorNode.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 nameCloudWatchLogs-to-S3任意
Choose a source
sourceDirect PUT or other sources
---次のページ---
Transform source records with AWS Lambda
Record transformationEnabled
Lambda functionkinesis-firehose-cloudwatch-logs-processor作成したLambda
Lambda function version$LATEST
Convert record format
Record format conversionDisabled
---次のページ---
Select a destination
DestinationAmazon S3
S3 destination
S3 destinationlog-backup-xxxxx作成したバケット
S3 prefixlogs/
S3 error prefixerror/
S3 backup
Source record S3 backupDisabled
S3 buffer conditions
Buffer size5MBデフォルト値
Buffer interval300secondsデフォルト値
S3 compression and encryption
S3 compressionDisabled
S3 encryptionDisabled
Error logging
Error loggingEnabled
Permissions
IAM roleCreate 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-nameLogs-to-Firehose任意
--filter-pattern""フィルターせず、全ての場合
--destination-arnarn:aws:firehose:ap-northeast-1:[アカウントID]:deliverystream/CloudWatchLogs-to-S3作成したFirehoseの配信ストリームのARN
--role-arnarn: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

· 約8分
moritalous
お知らせ

過去に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 ウェブストアからインストールしてください。

https://chrome.google.com/webstore/detail/chromebook-recovery-utili/jndclpdbaamdhonoechobihbbiimdgai?hl=ja

image

インストール手順

  1. RaspbianのOSイメージをダウンロード、展開します。
  2. Chromebook リカバリ ユーティリティを起動します。
  3. 画面右上のギアアイコンから「ローカルイメージを使用」を選択します。
  4. OSイメージファイルを選択する。 ※拡張子「*.bin」でフィルタリングされているので、注意
  5. 次々進んでインストールを完了させます。

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

プリントサーバー

本題です。

CUPS https://www.cups.org/

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

image

怒られても気にしない。

詳細設定 → localhostにアクセスする(安全ではありません) をクリック

image

何だこの解像度は。 設定を進めましょう。

  • [管理]タブを選択
  • [サーバー][サーバー設定]
    • 「このシステムに接続されているプリンターを共有」にチェック
    • 「リモート管理を許可」にチェック
    • 「所有者以外のユーザーにもジョブのキャンセルを許可」にチェック
  • 「設定の変更」ボタンをクリック
  • ログインダイアログが出たら、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