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

「AWS」タグの記事が97件件あります

全てのタグを見る

· 約2分
moritalous
お知らせ

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

すごいですQuarkus!!!!!! JavaのLambdaのコールドスタートがチョッパヤです!!

以下の公式サイトを参考に試しました。

https://quarkus.io/guides/amazon-lambda#tracing-with-aws-xray-and-graalvm

テスト対象

前回のAWS LambdaのJavaは遅い?とほぼ同じですが、以下が異なります。いずれもQuarkusの制限?制約?です。

  • アノテーションが付いてる
  • httpClientがUrlConnectionHttpClient
ソース全体
package example;

import javax.inject.Named;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;

@Named("test")
public class TestLambda implements RequestHandler<Object, Object> {

@Override
public Object handleRequest(Object input, Context context) {

String ENV_BUCKET = System.getenv("BUCKET");

S3Client s3 = S3Client.builder()
.region(Region.AP_NORTHEAST_1)
.httpClient(software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient.builder().build())
.build();

PutObjectResponse result = s3.putObject(
PutObjectRequest.builder().bucket(ENV_BUCKET).key("filename.txt").build(),
RequestBody.fromString("contents"));

System.out.println(result);

return "";
}
}

検証結果

回数レイテンシ(ms)処理内容
12700
2250
3305
4319
5187

前回はコールドスタートが6200msだったので、めちゃ早になりました!

検証結果(+Provisioned Concurrency)

こんなチョッパヤなQuarkusさんをProvisionedにしたらどうなるんでしょうね。ワクワクしますね。

回数レイテンシ(ms)処理内容
1417
2198
3206
4270
5147

期待を裏切らない速さ!すごいよ、Quarkus!

参考

https://quarkus.io/guides/amazon-lambda#tracing-with-aws-xray-and-graalvm https://aws.amazon.com/jp/blogs/architecture/field-notes-optimize-your-java-application-for-aws-lambda-with-quarkus/

· 約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

· 約2分
moritalous
お知らせ

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

フリートプロビジョニングで作成したモノのシャドウをフリートインデックスでクエリするとほぼ同じ内容ですが、フリートインデックスを試してみました。

フリートインデックスの作成を有効にする

AWSマネジメントコンソールでAWS IoTを開き、設定に移動します。

image.png

フリートインデックス作成を有効にするをオンにするとフリートインデックスが作成されます。

その下のチェックは、、、見づらい。。

上から順番に

  • モノのインデックス作成 - 名前、説明、および属性に基づいてモノを検索します。
  • Device Shadow の追加 - モノのインデックスに Device Shadow データを含めます。
  • モノの接続の追加 - モノのインデックスにモノの接続データを含めます。
  • モノのグループのインデックス作成 - グループ名、説明、および属性に基づいてモノのグループを検索します。

全部チェックつければすべてインデックス化されますが、課金がインデックスの更新でも発生するため、不必要な項目はチェックをオフにしましょう。

料金表 https://aws.amazon.com/jp/iot-device-management/pricing/

検索する

マネジメントコンソール

マネジメントコンソールから検索するには管理->モノフリートインデックス作成から行えます。

image.png

左の検索を選択

image.png

ページ下部にサンプルクエリがあるので、とてもわかり易いです。

image.png

現在接続中にデバイスを検索

connectivity.connected:true

image.png

切断されているデバイスの場合はfalseにするだけです。 簡単ですね。

CLI

上記と同様、接続中のデバイスを検索するには、

aws iot search-index --query-string 'connectivity.connected:true'

簡単ですね。

· 約3分
moritalous
お知らせ

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

AWS IoTのフリートプロビジョニング機能が面白そうだなぁと思ってAWS IoT Device SDK for PythonのGitHubのREADMEを眺めていると ## New Version Available の文字が!!!

AWS IoT SDK for Python v2が出てました。 https://github.com/aws/aws-iot-device-sdk-python-v2 (呼び方はAWS IoT SDK for Python v2なのかaws-iot-device-sdk-python-v2なのかAWS IoT Client SDK for Pythonなのかよくわかりません)

READMEによると

This SDK is built on the AWS Common Runtime, a collection of libraries written in C to be cross-platform, high-performance, secure, and reliable.

だそうです。

さらにv2はフリートプロビジョニングのAPIにもすでに対応しており、サンプルも含まれています。 今後はv2が主流でしょうか。

AWSのブログで紹介されていたサンプルと同じ内容をv2で試してみました。

フリートプロビジョニングを用いて、IoTデバイスとAWS IoT Coreの初期セットアップを自動化する方法

環境

Mac Python 3.8.2

AWS IoT SDK for Python v2のインストール

git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git
pip install ./aws-iot-device-sdk-python-v2

ブートストラップ証明書の配置

証明書は以下の場所に配置しました。

console
.
├── aws-iot-device-sdk-python-v2
└── certs
├── bootstrap-certificate.pem.crt
├── bootstrap-private.pem.key
└── root.ca.pem

サンプルの実行

templateNametemplateParametersはいい感じに修正ください。

cd aws-iot-device-sdk-python-v2/samples/

python fleetprovisioning.py \
--endpoint xxxxxxxxxx.iot.ap-northeast-1.amazonaws.com \
--root-ca ../../certs/root.ca.pem \
--cert ../../certs/bootstrap-certificate.pem.crt \
--key ../../certs/bootstrap-private.pem.key \
--templateName production_template \
--templateParameters '{"SerialNumber": 9999, "hasValidAccount": false}'

実行結果(ところどころ伏せたり端折ったりしてます)

Connecting to xxxxxxxxxx.iot.ap-northeast-1.amazonaws.com with client ID 'samples-client-id'...
Connected!
Subscribing to CreateKeysAndCertificate Accepted topic...
Subscribing to CreateKeysAndCertificate Rejected topic...
Subscribing to RegisterThing Accepted topic...
Subscribing to RegisterThing Rejected topic...
Publishing to CreateKeysAndCertificate...
Waiting... CreateKeysAndCertificateResponse: null
Published CreateKeysAndCertificate request..
Received a new message awsiot.iotidentity.CreateKeysAndCertificateResponse(certificate_id='xxxxxxxxxx', certificate_ownership_token='xxxxxxxxxx', certificate_pem='-----BEGIN CERTIFICATE-----\nxxxxxxxxxx\n-----END CERTIFICATE-----\n', private_key='-----BEGIN RSA PRIVATE KEY-----\nxxxxxxxxxx\n-----END RSA PRIVATE KEY-----\n')
Publishing to RegisterThing topic...
Waiting... RegisterThingResponse: null
Published RegisterThing request..
Received a new message awsiot.iotidentity.RegisterThingResponse(device_configuration={}, thing_name='born_9999')
Exiting Sample: success
Disconnecting...
Disconnected.

参考サイト

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/provision-wo-cert.html https://aws.amazon.com/jp/about-aws/whats-new/2020/04/announcing-general-availability-of-aws-iot-core-fleet-provisioning/ https://aws.amazon.com/jp/blogs/news/how-to-automate-onboarding-of-iot-devices-to-aws-iot-core-at-scale-with-fleet-provisioning/ https://qiita.com/tatsuhiroiida/items/46ef5035f99b304d3d6f

· 約4分
moritalous
お知らせ

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

いきなりですがまとめです。

  • OTA更新は/greengrass/ggc/core/greengrassdではなく/greengrass/ota/ota_agent/ggc-otaが起動している必要がある
  • 更新モジュールはS3からとってきている
  • マネジメントコンソールでGreengrass Core 更新ジョブを作成する(APIも存在する)
  • Greengrass Core ソフトウェアだけでなくGreengrass Core OTA エージェントの更新も可能(別々に実施する必要がある)
  • ジョブ作成後、即座に反映される
  • 更新の前後に自前のスクリプトを実施させることが可能。
    更新前にsystemctl stopして、更新後にsystemctl startするんだと思う。
    ただし、OTAエージェントの更新前にstopすると、OTAエージェントの更新が途中で止まってしまったので、こっちは何もしなくて良さそう。
  • 2020/6/6に試したところ、OTA エージェントのバージョンを更新すると、ダウングレードする気がする

検証内容

環境

Docker上で検証(Docker Desktop 2.2.0.4 on Mac)

Greengrass(更新前) v1.10.0 OTAエージェント v1.2.0

Docker関連

FROM amazon/aws-iot-greengrass:1.10.0-amazonlinux

RUN yum install -y procps sysvinit-tools wget

OTA更新時に必要なものがあるので、追加インストールします。

docker-compose.yml
version: '3'
services:
greengrass:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./greengrass/certs:/greengrass/certs
- ./greengrass/config:/greengrass/config
- ./greengrass/deployment:/greengrass/ggc/deployment
- ./greengrass/log:/greengrass/ggc/var/log
- ./greengrass/usr:/greengrass/usr
- ./greengrass/var/log/greengrass:/var/log/greengrass
- ./workspace:/workspace
restart: always
privileged: true
command: /sbin/init
environment:
TZ: Asia/Tokyo
tty: true

volumesでcertsconfigをマウント。その他はログを見たりするためにマウントしました。

OTAエージェントのログは、Greengrass Coreのログとは別に/var/log/greengrassに出力されます。(Greengrass Coreのログは/greengrass/ggc/var/log

systemdを使用したいのでprivileged: truecommand: /sbin/initを追加しました。

systemd関連

[Unit]
Description=Greengrass Daemon

[Service]
Type=forking
PIDFile=/var/run/greengrassd.pid
Restart=on-failure
ExecStart=/greengrass/ggc/core/greengrassd start
ExecReload=/greengrass/ggc/core/greengrassd restart
ExecStop=/greengrass/ggc/core/greengrassd stop

[Install]
WantedBy=multi-user.target
[Unit]
Description=Greengrass OTA Agent

[Service]
Type=forking
PIDFile=/var/run/ggc-ota.pid
Restart=on-failure
KillMode=mixed
ExecStart=/greengrass/ota/ota_agent/ggc-ota
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
[Install]
WantedBy=multi-user.target
bash-4.2# systemctl enable greengrass.service
bash-4.2# systemctl enable greengrass_ota.service

bash-4.2# systemctl start greengrass.service
bash-4.2# systemctl start greengrass_ota.service

Greengrass設定

config.json
{

"coreThing": {

},
"runtime": {

},
"managedRespawn": true

}
/greengrass/usr/scripts/ggc_pre_update.sh
systemctl stop greengrass.service
systemctl start greengrass.service

ota_pre_update.shota_post_update.shも配置できるので、同様にstopしてみたのですが、OTAエージェントの更新が途中で止まってしまいました。OTAエージェントは事前のstopも事後のstartも不要な感じです。

検証

OTA更新前の状態

bash-4.2# ls -l /greengrass/ggc/packages/
total 4
drwxr-xr-x 1 root root 4096 Jun 6 21:13 1.10.0

bash-4.2# ls -l /greengrass/ota/
total 4
lrwxrwxrwx 1 root root 16 Nov 26 2019 ota_agent -> ota_agent_v1.2.0
drwxr-xr-x 1 root root 4096 Jun 6 21:13 ota_agent_v1.2.0

bash-4.2#

OTA更新後の状態

bash-4.2# ls -l /greengrass/ggc/packages/
total 4
drwxr-xr-x 8 root root 4096 Jun 6 21:57 1.10.1_1

bash-4.2# ls -l /greengrass/ota/
total 4
lrwxrwxrwx 1 root root 21 Jun 6 21:55 ota_agent -> ./ota_agent_v1.0.0_1/
drwxr-xr-x 4 root root 4096 Jun 6 21:55 ota_agent_v1.0.0_1

bash-4.2#

OTAエージェントがバージョンダウンしてるよね?

参考にしたサイト

 https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/core-ota-update.html  https://qiita.com/mikene_koko/items/4c71c969f55e3fe24190  https://qiita.com/snaka/items/48c0998ffa1e34975a6f  https://qiita.com/a_yasui/items/f2d8b57aa616e523ede4