プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

【Android】コンテンツプロバイダ一覧の取得

Android のアプリを作っているときに、端末に入っているコンテンツプロバイダの一覧を取得する必要が出てきました。

調べてみたら案外簡単でしたが、知らなかったのでメモっときます。

コンテンツプロバイダの一覧の取得

やり方は下記の Stackoverflow に示唆されていて、

How to find third party apps content providers URI in android? - Stack Overflow

PackageManager#queryContentProviders メソッドを使えば、コンテンツプロバイダの情報が取得できるようです。

あとはこれをループで回して、ログにでも出せばOKですね。MainActivity に埋め込んだらこんな感じです。

コンテンツプロバイダの一覧

上記のサンプルでは、下記記事を参考に、ログに出すときにパッケージ名だけでなくアプリケーション名も出しています。

android - get application name from package name - Stack Overflow

他のフィールドを出力すれば、いろいろな情報も取れそうです。 ご参考までに。

Firebase Authentication の Google ログインのサポートメールを変更

今度 Android アプリを作成するときに使うことになったので、今更ながらですが、 Firebase を触り始めました。

で、まずは Build Friendly Chat のチュートリアルを試してみました。Google ログインとかが簡単にできて、これはいいですね。

無事にチュートリアルが終わってから、Firebase プロジェクト画面の設定をあれこれ眺めていると、『サポートメール』という欄に自分のメールアドレスを設定していることを思い出しました。『?』のアイコンにカーソルを合わせると

f:id:junichim:20200807130026p:plain

Google で認証を行う際にユーザーに表示されるメールアドレスです。あなたのログイン メールアドレスか、あなたが管理する Google グループのメールアドレスに変更できます。

と出てきます。

この説明の通りだと、メールアドレスが利用者に表示されるっぽいので、ちょっと避けたいです。

とはいえ、下記のスクリーンショットのように、チュートリアルアプリのチャット画面では、特にサポートメールのメールアドレスは表示されていないようです(表示されているのはこのスマホで設定している Google アカウントとそのメアド)。実際にはどういうことなんでしょうね?

f:id:junichim:20200807130728p:plain

いずれにしても、サポートメールを変更してみます。

なお、このサポートメール自体は、Google ログインで必要とされており、Authentication の Sign-in method の Google を選択した際の画面からも見ることができます。

f:id:junichim:20200807132154p:plain

サポートメールの変更方法

で、早速変えようとしたのですが、このサポートメールの部分は、ドロップダウンリストからの選択式で、任意のメールアドレスを入力することができません。

さきほどの画面に『Googleグループのメールアドレス』がうんぬんかんぬんなどと書いてありますが、ここに Google グループが登場するのがちょっとピンときません。

そのあたりが気になったので、どうやって変更するのかと思って調べてみると、Stackoverflow にやり方がありました。

How do I change the Support Email of a Firebase Project? - Stack Overflow

どうも、Firebase プロジェクトで『ユーザーと権限』からメンバーを追加すれば、追加したメンバーのメールアドレス(たぶんGoogleアカウントとして登録されている必要がありそう)に変更することができるようです。早速試してみます。

  1. 変更先として使いたいメールアドレスの Google アカウントを作成
  2. Firebase プロジェクトで、『メンバーを追加』ボタンを押す f:id:junichim:20200807125054p:plain
  3. メールアドレスを入れて、役割として『編集者』を選択して追加
  4. 追加したユーザーに招待メールが届くので、そのメールで 『Firebase コンソールを開く』をクリック
  5. Firebase の管理画面が表示されるので、『設定』の『全般』を開くと『公開設定』の『サポートメール』に追加したユーザーのメールアドレスが選択できるようになるので、そちらを選択 f:id:junichim:20200807125459p:plain
  6. 無事にサポートメールが変更されました

この方法のほうがピンときますね。 Google グループに追加してやる方法は試してないので、相変わらず謎のままですが、とりあえずこれで対応できるので、良しとします。

CloudWatch Agent を試してみました

さて、こちらの記事で書いたように、自分用の Redmine を 4.1.1 にアップデートしました。この際、サーバーも新たにしました。

以前、下記の記事で書いたようにディスク容量がひっ迫してえらい目にあったので、今回もディスクの空き容量の監視を行いたいと思います。

blog.mori-soft.com

更新前のサーバー(Redmine 3.3.2 を運用)では CloudWtach スクリプトを利用して、ディスク容量監視を行っていました。設定方法などはこちらの記事にありますのでご参考にどうぞ。

今回も同じようにすればよいと思い調べてみると、昨今は Cloudwatch スクリプトではなくて、CloudWatch Agent を使うのが良いようです。

ということで、試してみたので、メモっときます。

Cloudwatch Agent によるディスク使用量の監視

まず、 CloudWtach Agent がどんなものか調べてみました。

Amazon Systems Manager と統合されていたり、インスタンス内のログを CloudWtach で管理できたりと非常に便利そうです(使わないけど)。

ま、まずは試してみないとなんとも言えないので、やってみます。

IAM ロールの作成

CloudWatch Agent を使うには IAM ロールがいるとのことなので、作成します。

AWS のコンソールで IAM を選び、ロールの作成を選択します。サービスとして、EC2を選びます。

f:id:junichim:20200701165339p:plain

次に、ポリシーとして、 CloudWatchAgentServerPolicy を選択します。 Amazon Systems Manager は使わないので、 CloudWatchAgentAdminPolicy は不要です。

f:id:junichim:20200701165505p:plain

あと、ロール名を適当に設定すれば完了です。

f:id:junichim:20200701165654p:plain

これを EC2 のインスタンスに割り当てます。 割り当てたいインスタンスを選び、

f:id:junichim:20200701165813p:plain

アクションから、『インスタンスの設定』、『IAMロールの割り当て/置換』と進みます。

f:id:junichim:20200701170004p:plain

割り当て設定画面で、先ほど作成した IAM ロール名を選択すれば完了です。

インストール

実際に作業する際の手順は下記を参考にしました。

コマンドラインを使用して CloudWatch エージェントをインストールする - Amazon CloudWatch

インストールはコマンドラインから行います。

ダウンロード

bitnami@ip-172-30-0-111:~$ wget https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/debian/amd64/latest/amazon-cloudwatch-agent.deb
--2020-06-28 18:25:35--  https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/debian/amd64/latest/amazon-cloudwatch-agent.deb
s3.ap-northeast-1.amazonaws.com (s3.ap-northeast-1.amazonaws.com) をDNSに問いあわせています... 52.219.136.54
s3.ap-northeast-1.amazonaws.com (s3.ap-northeast-1.amazonaws.com)|52.219.136.54|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 57648712 (55M) [application/octet-stream]
`amazon-cloudwatch-agent.deb' に保存中

amazon-cloudwatch-agent.deb                 100%[==========================================================================================>]  54.98M  91.3MB/s 時間 0.6s

2020-06-28 18:25:36 (91.3 MB/s) - `amazon-cloudwatch-agent.deb' へ保存完了 [57648712/57648712]

bitnami@ip-172-30-0-111:~$

パッケージのインストール

bitnami@ip-172-30-0-111:~$ sudo dpkg -i -E amazon-cloudwatch-agent.deb
以前に未選択のパッケージ amazon-cloudwatch-agent を選択しています。
(データベースを読み込んでいます ... 現在 31402 個のファイルとディレクトリがインストールされています。)
amazon-cloudwatch-agent.deb を展開する準備をしています ...
create group cwagent, result: 0
create user cwagent, result: 0
amazon-cloudwatch-agent (1.246396.0-1) を展開しています...
amazon-cloudwatch-agent (1.246396.0-1) を設定しています ...
bitnami@ip-172-30-0-111:~$

特に問題もなくパッケージがインストールされました。

設定

CloudWtach Agent の設定はウィザードでやるのが簡単なようです。

bitnami@ip-172-30-0-111:~$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:
1
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
2
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
1
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
2
Current config as follows:
{
// 中略
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
// 中略
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2
Program exits now.
bitnami@ip-172-30-0-111:~$

中略としているところでは、作成されたjsonファイルが表示されています。 ほとんどがデフォルトを選べば問題ないようです。なお、メトリクスの種類として、ディスクの i-ノードの残り容量を知りたかったので、 Standard を選択しています。

試用

設定が終わったら、起動してみます。

bitnami@ip-172-30-0-111:~$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source file:/opt/aws/amazon-cloudwatch-agent/bin/config.json --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
2020/06/28 21:12:56 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
Valid Json input schema.
I! Detecting runasuser...
No csm configuration found.
No log configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
Created symlink /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service → /etc/systemd/system/amazon-cloudwatch-agent.service.
bitnami@ip-172-30-0-111:~$

動いているか確認します。

bitnami@ip-172-30-0-111:~$ /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status
{
  "status": "running",
  "starttime": "2020-06-28T12:12:57+00:00",
  "version": "1.246396.0"
}
bitnami@ip-172-30-0-111:~$

問題ないようです。

しばらくしてから、 AWS のコンソールで CloudWatch のメトリクスを見ると、 カスタムメトリクス CWA が追加されており、ディスク容量などの状態を見ることができました。

費用問題

さて、これでディスク容量も監視できるようになったし、めでたしめでたし、と終わりたかったのですが、よくよく考えてみるとカスタムメトリクスが結構大量に追加されています。これって、お金かかるんじゃなかったっけ?と思い出して、調べてみました。

すると、今回の場合はカスタムメトリクスが28個も追加されてて、0.3/メトリクス/月なので、約$8.5ぐらい毎月かかることになります。

マジ!?

EC2のインスタンス代よりはるかに大きいです・・・

せっかく、EC2 のインスタンス代を抑えようとしてスポットインスタンスをつかったりしてたのに、本末転倒感がたっぷりです(まあ、監視も必要なので、本当は本末転倒ではないんですがね)。

ということで、このままで使い続けるわけにはいかないので、一旦アンインストールしておきます。

アンインストール

とりあえず、メトリクスの送信を停止します。

bitnami@ip-172-30-0-111:~$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop
bitnami@ip-172-30-0-111:~$ 
bitnami@ip-172-30-0-111:~$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "stopped",
  "starttime": "",
  "version": "1.246396.0"
}
bitnami@ip-172-30-0-111:~$ 

改めて、状態を確認します。

bitnami@ip-172-30-0-111:~$ sudo systemctl status amazon-cloudwatch-agent.service 
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2020-06-30 08:34:15 JST; 2min 55s ago
  Process: 2302 ExecStart=/opt/aws/amazon-cloudwatch-agent/bin/start-amazon-cloudwatch-agent (code=killed, signal=TERM)
 Main PID: 2302 (code=killed, signal=TERM)

 6月 30 08:34:15 ip-172-30-0-111 systemd[1]: Stopping Amazon CloudWatch Agent...
 6月 30 08:34:15 ip-172-30-0-111 systemd[1]: amazon-cloudwatch-agent.service: Main process exited, code=killed, status=15/TERM
 6月 30 08:34:15 ip-172-30-0-111 systemd[1]: amazon-cloudwatch-agent.service: Succeeded.
 6月 30 08:34:15 ip-172-30-0-111 systemd[1]: Stopped Amazon CloudWatch Agent.
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
bitnami@ip-172-30-0-111:~$ 

このままだと再起動するとサービスが始まるので、無効にしておきます。

(参考) https://forums.aws.amazon.com/thread.jspa?messageID=908106

bitnami@ip-172-30-0-111:~$ sudo systemctl disable amazon-cloudwatch-agent.service 
Removed /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service.
bitnami@ip-172-30-0-111:~$ 
bitnami@ip-172-30-0-111:~$ sudo systemctl status amazon-cloudwatch-agent.service 
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

 6月 30 08:34:15 ip-172-30-0-111 systemd[1]: Stopping Amazon CloudWatch Agent...
 6月 30 08:34:15 ip-172-30-0-111 systemd[1]: amazon-cloudwatch-agent.service: Main process exited, code=killed, status=15/TERM
 6月 30 08:34:15 ip-172-30-0-111 systemd[1]: amazon-cloudwatch-agent.service: Succeeded.
 6月 30 08:34:15 ip-172-30-0-111 systemd[1]: Stopped Amazon CloudWatch Agent.
bitnami@ip-172-30-0-111:~$ 

まあ、このままにしておいてもいいんですが、ついでなのでパッケージも削除しておきます。

bitnami@ip-172-30-0-111:~$ sudo dpkg -r amazon-cloudwatch-agent 
(データベースを読み込んでいます ... 現在 32407 個のファイルとディレクトリがインストールされています。)
amazon-cloudwatch-agent (1.246396.0-1) を削除しています ...
bitnami@ip-172-30-0-111:~$ 

ゴミ収集

bitnami@ip-172-30-0-111:~$ sudo rm -rf /opt/aws/

これでアンインストールされました。

メトリクスは自分で削除することはできなくて、一度メトリクスを追加したら15ヶ月は消えないそうです・・・・ 高い授業料になりました。

次善策

ということで、 CloudWatch Agent は便利そうですが、お金もそれなりに必要なので今回は採用を見合わせました。

じゃあ、どうやって監視するのがいいのか? 例えば、

  • 既にサポート外となった、 CloudWatch スクリプトを使う
  • zabbixサーバー立てる
  • 自分でディスク容量調べて、メール通知する
  • etc

なんかが頭に浮かんでますが、どうするのがいいか、決めきれていません。 あー、悩ましい。 しばらく考えてみようと思います。

一応、モニタリングスクリプトの記事もまだあります。

Amazon EC2 Linux インスタンスのメモリとディスクのメトリクスのモニタリング - Amazon Elastic Compute Cloud