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

「azure」タグの記事が5件件あります

全てのタグを見る

· 約10分
moritalous

環境構築

認証局を構築する

Hashicorp社のVaultを使用します

  1. 設定ファイルの作成

    config.hcl
    storage "raft" {
    path = "/vault/file"
    node_id = "node1"
    }

    listener "tcp" {
    address = "0.0.0.0:8200"
    tls_disable = "true"
    }

    disable_mlock = true

    api_addr = "http://127.0.0.1:8200"
    cluster_addr = "https://127.0.0.1:8201"
    ui = true
  2. 起動

    docker run --rm -p 8200:8200 \
    -v `pwd`/vault/file:/vault/file \
    -v `pwd`/vault/logs:/vault/logs \
    -v `pwd`/config.hcl:/config.hcl \
    vault server -config=/config.hcl
  3. ブラウザで127.0.0.1:8200にアクセス

  • Create a new Raft clusterを選択

    image.png

  • key sharesを5、Key thresholdを3に指定。(詳細は公式ドキュメントを参照ください。)

    image.png

  • 画面遷移後、少し待つとキーが発行されます。Download keysでキーを一括ダウンロードしContinue to Unsealをクリックします。

    image.png

  • ダウンロードしたファイルのkeysから、3回別々のkey入力します。

    image.png

  • 右上のStatusが緑色に変わりました。ダウンロードしたファイルのroot_tokenを使ってログインします。

    image.png

  • ログインできました。

    image.png

認証局の作成

Enable new Engineをクリックします。

image.png

PKI Certificatesを選択し、Nextをクリックします。

image.png

Method Optionsを開き、Max Lease TTLを3650daysに設定します。Enable Engineをクリックします。

image.png

ConfigurationタブのConfigureボタンをクリック、Configure CAをクリックします。

image.png

項目を入力し、Saveボタンをクリックします。

項目
Common nameMy Private Certificate Authority
Options -> TTL3650days

Certificateが生成されるのでファイルに保存します。名前はprivate_root_CA.pemとしておきます。

URLsタブを選択し、Issuing certificateshttp://127.0.0.1:8200/v1/pki/caCRL Distribution Pointshttp://127.0.0.1:8200/v1/pki/crlと入力し、Saveボタンをクリックします。

image.png

パンくずリストのpkiから画面を戻り、RolesタブのCreate roleボタンをクリックします。

image.png

以下の項目を入力し、Create roleボタンをクリックします。

項目
Role nameMyPrivateCertificateAuthority
Options -> Allow any nameチェックを付ける
Options -> Enforce hostnamesチェックを外す

ここまでで認証局の作成は完了です。

デバイス証明書を作成

デバイス証明書を作成して登録しましょう。

Vaultの画面でMyPrivateCertificateAuthorityロールのメニューからGenerate certificateをクリックします。(ロール名のクリックでもOKです)

image.png

Common nameを入力し、Generateボタンをクリックします。

image.png

Certificate、Private keyを保存しておきます。(それぞれcertificate.pem、private.keyとします。) 画面下部のCopy credentialsからJSON形式で一括取得が可能です。

クラウドに接続

AWS IoT

IoT Coreの管理画面でCA証明書まで遷移し、CA証明書を登録ボタンをクリックします。

image.png

ページ中程に説明のある検証証明書を作成する必要があります。登録コードはこの後必要なのでコピーしておきます。

image.png

image.png

OpenSSLで以下のコマンドを実行します。

openssl genrsa -out verification_cert_key_filename.key 2048

ファイルが作成されます。続いてこちらのコマンド。

openssl req -new -key verification_cert_key_filename.key -out verification_cert_csr_filename.csr

入力が求められるので、Common Name以外は未入力でエンター、Common Nameは先程の登録コードを入力します。

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: <===== ここに検証コード
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Vaultの画面に戻り、Rolesに作成したMyPrivateCertificateAuthorityの右側メニューから、Sign certificateを選択します。

image.png

以下の項目を入力し、Generateをクリックします。

項目
Certificate Signing Request (CSR)OpenSSLで生成したCSRファイルの内容
Common name検証コード
Options -> Exclude Common Name from Subject Alternative Names (SANs)チェックを付ける

image.png

証明書が作成されるので、ファイルに保存します。(verification_cert_filename.pemとします)

AWSの管理画面に戻ります。 CA 証明書にprivate_root_CA.pem、検証証明書にverification_cert_filename.pemを指定し、登録ボタンをクリックします。

image.png

CA証明書が登録されました。

証明書画面の証明書を登録ボタンをクリックします。

image.png

CA が AWS IoT に登録されていますを選択した状態でCA証明書を選択、作成済みのデバイス証明書をアップロードします。有効化もこのタイミングで実施しておくと良いでしょう。登録ボタンをクリックします。

image.png

IoTポリシーを作成します。ポリシーの画面でポリシーを作成ボタンをクリックします。

image.png

お試しなので、フル権限で作成します。ポリシーアクションとポリシーリソースはいずれも*です。作成をクリックします。

image.png

証明書の画面に戻り、先程登録したデバイス証明書にポリシーをアタッチします。

image.png

image.png

準備完了です。

接続します。

MQTTクライアントで以下の内容を入力し、接続します。

項目
プロトコルmqtts
ホスト名AWS IoTの設定画面で表示されるエンドポイント
ポート番号8883
クライアントID任意の文字
ユーザー名未指定
パスワード未指定
CAファイルAmazon Root CA 1を保存したファイル
クライアント証明書デバイス証明書(certificate.pem)
プライベートキープライベートキー(private.key)
  • Subscribeトピック名
任意(一部AWS予約トピックあり)
  • Publishトピック名
任意(一部AWS予約トピックあり)

GCP

注意

Google Cloud IoT Coreのサービスは2023年8月16日に廃止されるようです。(https://cloud.google.com/iot-core?hl=ja

GCPのIoT Core管理画面を開き、レジストリを登録ボタンをクリックします。

image.png

レジストリID、リージョン、Cloud Pub/Subトピックを入力、CA証明書欄private_root_CA.pemの値を貼り付け、作成ボタンをクリックします。

image.png

次はデバイスを登録します。左メニューのデバイスを選択し、デバイスを作成ボタンをクリックします。

image.png

デバイスID(device1)を入力し、認証欄にcertificate.pemの内容を貼り付けます。公開鍵の種類はRS256_X509を選択します。作成ボタンをクリックします。

接続します。

MQTTクライアントで以下の内容を入力し、接続します。

項目
プロトコルmqtts
ホスト名mqtt.googleapis.com
ポート番号8883
クライアントIDprojects/{GCPのプロジェクトID}/locations/{リージョン}/registries/{レジストリ名}/devices/{デバイス名}
ユーザー名unused
パスワードこちらの方法で生成したJWT
CAファイルGoogle ルート CA 認証パッケージを保存したファイル
クライアント証明書デバイス証明書(certificate.pem)
プライベートキープライベートキー(private.key)
  • Subscribeトピック名
/devices/{デバイス名}/commands/#
/devices/{デバイス名}/config

GCPの管理画面から構成を編集ボタン、コマンドを送信ボタンでテスト送信が可能です。

  • Publishトピック名
/devices/{デバイス名}/events

Azure

IoT Hubを作成します。

image.png

IoT Hub名を入力し、確認及び作成ボタンをクリック、作成ボタンをクリックします。

image.png

ルート証明書を登録します。左の証明書メニューを選択し、追加ボタンをクリックします。

image.png

証明署名を入力、private_root_CA.pemを選択、アップロード時に証明書の状態を確認済みに設定するにチェックを入れ、保存ボタンをクリックします。

image.png

次にデバイスを登録します。左のデバイスメニューを選択し、デバイスの追加ボタンをクリックします。

image.png

デバイスIDを入力しますが、ここで指定するデバイス名はデバイス証明書作成時に指定したCommon nameと同一である必要があります。認証の種類をX.509 CA 署名済みとし、保存ボタンをクリックします。

接続

接続します。

MQTTクライアントで以下の内容を入力し、接続します。

項目
プロトコルmqtts
ホスト名{IoT Hub名}.azure-devices.net
ポート番号8883
クライアントID{デバイスID}
ユーザー名{IoT Hub名}.azure-devices.net/{デバイスID}
パスワード未指定
CAファイルBaltimore CyberTrust Rootを保存したファイル
クライアント証明書デバイス証明書(certificate.pem)
プライベートキープライベートキー(private.key)
  • Subscribeトピック名
devices/{デバイスID}/messages/devicebound/#

Azureの管理画面からデバイスへのメッセージボタンでテスト送信が可能です。

  • Publishトピック名
/devices/{デバイスID}/messages/events/

· 約7分
moritalous
お知らせ

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

外出時に自宅のラズパイが気になることありませんか? ブラウザさえあれば、Azure Cloud Shellからアクセスできますので、紹介します。

仕組み

IoT Hub デバイス ストリームの機能を使います。2020/11/1現在プレビュー状態ですが、誰でも試すことが可能です。

Azure IoT Hub デバイス ストリームによって、さまざまな cloud-to-device 通信シナリオのセキュリティで保護された双方向 TCP トンネルの作成が容易になります。 デバイス ストリームは、デバイスとサービス エンドポイント間のプロキシとして機能する、IoT Hub ストリーミング エンドポイントによって仲介されます。

device-stream-proxy-diagram.png

(画像は公式サイトのものです) https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-streams-overview

IoT Hubが仲介することで、通常はファイアーウォールに防がれてアクセスできないRaspberry Piに外部からアクセスできるようになります。

環境

デバイス側

Raspberry Pi 3 Raspberry Pi OS (32-bit) Lite 最新版(2020-08-20)

セットアップ

以下の手順で進めます。

  1. Azure IoT Hubの設定
  2. デバイス(Raspberry Pi)側の設定
  3. サービス(Azure Cloud Shell)側の設定

1. Azure IoT Hubの設定

Azure IoT Hubの作成は、Azure Cloud Shellで実行します。

Azure IoT 拡張機能を追加

AzureCloudShell
az extension add --name azure-iot

Azure IoT Hubを作成

無料のSKUで作成します。 デバイスストリームに対応しているリージョンは限られています。

  • 米国中部
  • 米国中部 EUAP
  • 東南アジア
  • 北ヨーロッパ
AzureCloudShell
az iot hub create --name [IoT Hub名] --resource-group [リソースグループ名] --location centralus --sku f1 --partition-count 2

デバイスを作成

Raspberry PiがIoTデバイス扱いとなりますので、IoT Hubにデバイスを作成します。デバイスIDはraspberrypiとしました。

AzureCloudShell
az iot hub device-identity create --hub-name [IoT Hub名] --device-id raspberrypi

接続文字列を取得

接続文字列は2種類必要です。

デバイス(Raspberry Pi)側で使用する接続文字列

AzureCloudShell
az iot hub device-identity connection-string show --hub-name [IoT Hub名] --device-id raspberrypi --output tsv

サービス(Azure Cloud Shell)側で使用する接続文字列

AzureCloudShell
az iot hub connection-string show --policy-name service --hub-name [IoT Hub名] --output tsv

これで、Azure IoT Hubの設定は完了です。

2. デバイス(Raspberry Pi)側の設定

つづけてRaspberry Piの設定です。 OSをインストールした直後の状態から進めたいと思います。

必要なソフトウェアのインストール

RaspberryPi
sudo apt install git cmake libssh-dev libcurl4-openssl-dev uuid-dev -y

デバイス側ソースの取得

パブリックプレビュー用ブランチを使用します。

RaspberryPi
git clone -b public-preview https://github.com/Azure/azure-iot-sdk-c.git
cd azure-iot-sdk-c
git submodule update --init

ソースの修正

azure-iot-sdk-c/iothub_client/samples/iothub_client_c2d_streaming_proxy_sampleにあるiothub_client_c2d_streaming_proxy_sample.cにデバイス側で使用する接続文字列を指定します。(70行目です)

iothub_client_c2d_streaming_proxy_sample.c
static const char* connectionString = "[device connection string]";

makeする

公式ドキュメントではmake -jと書いてありますが、メモリ不足で失敗しますので、-jは外しました。

RaspberryPi
cd ~/azure-iot-sdk-c/
mkdir cmake
cd cmake
cmake ..
make

makeが成功するとazure-iot-sdk-c/cmake/iothub_client/samples/iothub_client_c2d_streaming_proxy_sample/iothub_client_c2d_streaming_proxy_sampleが生成されます

わかり易い場所に移動します。

RaspberryPi
mkdir ~/bin
cp iothub_client/samples/iothub_client_c2d_streaming_proxy_sample/iothub_client_c2d_streaming_proxy_sample ~/bin/

自動起動の設定

serviceファイルを作成します。

iothub_client_c2d_streaming_proxy.service
[Unit]
Description=IoT Hub Client C2D Streaming Proxy
After=network.target

[Service]
ExecStart=/home/pi/bin/iothub_client_c2d_streaming_proxy_sample
WorkingDirectory=/home/pi/bin
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

serviceを有効にして起動します。

RaspberryPi
sudo mv ~/iothub_client_c2d_streaming_proxy.service.service /etc/systemd/system/
sudo systemctl enable iothub_client_c2d_streaming_proxy.service
sudo systemctl start iothub_client_c2d_streaming_proxy.service

デバイス(Raspberry Pi)側の設定は完了です。

3. サービス(Azure Cloud Shell)側の設定

サービス側のサンプルはNode.jsで動作します。Azure Cloud Shellで提供されているNode.jsのバージョンはv8.16.0ですが、v10以上が必要なので、まずはNode.jsをセットアップします。

Node.jsのインストール

AzureCloudShell
wget https://nodejs.org/dist/v10.19.0/node-v10.19.0-linux-x64.tar.gz
mkdir ~/node
tar zxf node-v10.19.0-linux-x64.tar.gz -C ~/node/
cd node
ln -s node-v10.19.0-linux-x64 node
echo 'export PATH=~/node/node/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

サービス側ソースの取得

AzureCloudShell
wget https://github.com/Azure-Samples/azure-iot-samples-node/archive/streams-preview.zip
unzip streams-preview.zip
mv azure-iot-samples-node-streams-preview/iot-hub/Quickstarts ~/

外部ライブラリーの取得

AzureCloudShell
cd ~/Quickstarts/device-streams-service/
npm install azure-iothub@streams-preview
npm install

環境変数の設定

Node.jsのプログラムは環境変数を参照するようですので、必要な情報を環境変数にセットします。 IOTHUB_CONNECTION_STRINGにサービス側で使用する接続文字列をセットします。 ※Azure CLIで取得して設定するように工夫してみました

AzureCloudShell
echo 'export IOTHUB_CONNECTION_STRING="`az iot hub connection-string show --policy-name service --hub-name [IoT Hub名] --output tsv`"'>> ~/.bashrc
echo 'export STREAMING_TARGET_DEVICE=raspberrypi' >> ~/.bashrc
echo 'export PROXY_PORT=2222' >> ~/.bashrc
source ~/.bashrc

これでサービス(Azure Cloud Shell)側の設定は完了です。

接続

準備は整いましたので、実際に接続してみましょう。 デバイス側はもう特に触りませんので、Azure Cloud Shell上で作業します。

AzureCloudShell
cd ~/Quickstarts/device-streams-service/
node proxy.js &
ssh pi@localhost -p 2222

Node.jsのProxyプログラムはフォアグラウンドで動作する仕組みなのでバックグラウンドで動作させます。 localhost(=Azure Cloud Shell)の2222ポートにSSHで接続することで、デバイス側に接続ができます。

Azure Cloud Shellのインスタンスが停止したあとでも、接続の手順を行うとデバイス側に接続できます。

AzureのAndroidアプリからもこの通り。 これでいつでもどこでもRaspberry Piにアクセスできますね。

Screenshot_20201101-205702.png

参考サイト

https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-streams-overview https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-device-streams-proxy-c https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-device-streams-proxy-nodejs

· 約7分
moritalous
お知らせ

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

最近Azureも触りだしましたが、AWSにない便利な機能の一つにAzure Cloud Shellがあります。

Azure Cloud Shellとは

Azure Cloud Shell は、Azure リソースを管理するための、ブラウザーでアクセスできる対話形式の認証されたシェルです。 Bash または PowerShell どちらかのシェル エクスペリエンスを作業方法に合わせて柔軟に選択できます。

https://docs.microsoft.com/ja-jp/azure/cloud-shell/overview

ブラウザからちょっとしたコマンドが実行できるので便利ですね。また、Windows ターミナルやスマホアプリからも使用することができます。 Azure Cloud shellの環境にAWS CLIをインストールしてしまおうという作戦です。

image.png

Azure Cloud Shellの概要

公式サイトからの引用です

概念

  • Cloud Shell は、ユーザーごとにセッション単位で一時的に提供されるホスト上で実行されます。
  • Cloud Shell は、無操作状態で 20 分経過するとタイムアウトとなります。
  • Cloud Shell では、Azure ファイル共有がマウントされている必要があります
  • Cloud Shell では、Bash と PowerShell に対して同じ Azure ファイル共有が使用されます
  • Cloud Shell には、ユーザー アカウントごとに 1 台のマシンが割り当てられます。
  • Cloud Shell はファイル共有に保持されている 5 GB のイメージを使用して $HOME を永続化します
  • Bash では、標準の Linux ユーザーとしてアクセス許可が設定されます。

Bashが使え、5GBのファイル領域があり、$HOMEは永続化されるところがポイントです。

価格

Cloud Shell のホストとなるマシンは無料です。ただし、前提条件として Azure Files 共有をマウントする必要があります。 ストレージのコストは通常どおりに適用されます。

月額約¥6.72/Giなので5G使っても月35円ぐらいです。

AWS CLI V2のインストール

Linux での AWS CLI バージョン 2 のインストールを参考にしますが、ポイントは

  • ホームディレクトリ内にインストールする

です。

@Azure:~$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 31.9M 100 31.9M 0 0 102M 0 --:--:-- --:--:-- --:--:-- 102M
@Azure:~$ unzip -q awscliv2.zip
@Azure:~$ ./aws/install -i ~/aws-cli -b ~/bin
You can now run: /home/xxxxxx/bin/aws --version
@Azure:~$ rm -rf aws
@Azure:~$ rm -rf awscliv2.zip
@Azure:~$
@Azure:~$ ~/bin/aws --version
aws-cli/2.0.46 Python/3.7.3 Linux/4.15.0-1093-azure exe/x86_64.ubuntu.16
@Azure:~$

~/binディレクトリにパスが通るように、.bashrcに書いておきましょう

@Azure:~$ echo 'export PATH=~/bin:$PATH' >> .bashrc
@Azure:~$
@Azure:~$ source .bashrc
@Azure:~$ aws --version
aws-cli/2.0.46 Python/3.7.3 Linux/4.15.0-1093-azure exe/x86_64.ubuntu.16
@Azure:~$

これでインストールは完了です。

認証情報の設定

通常、AWSの認証情報は~/.awsに保管されますが、Azure Cloud Shellの説明に

SSH キーなどのシークレットを格納するときは、ベスト プラクティスを使用します。 Azure Key Vault などのサービスには、設定用のチュートリアルが用意されています。

とありますので、これを使って認証情報を保存してみましょう。

Key Vaultの作成と認証情報の登録

Key Vaultの作成 cloud-shell-aws-cliがKey Vaultの名称です。

@Azure:~$ az keyvault create --name cloud-shell-aws-cli --resource-group [リソースグループ名] --location japaneast

AWS アクセスキーの登録

@Azure:~$ az keyvault key create --vault-name cloud-shell-aws-cli --name aws-access-key-id --protection software
@Azure:~$ az keyvault secret set --vault-name cloud-shell-aws-cli --name aws-access-key-id --value [AWS アクセスキー]

シークレットキーの登録

@Azure:~$ az keyvault key create --vault-name cloud-shell-aws-cli --name aws-secret-access-key --protection software
@Azure:~$ az keyvault secret set --vault-name cloud-shell-aws-cli --name aws-secret-access-key --value [シークレットキー]

AWS リージョンの登録(機密性はありませんが。。)

@Azure:~$ az keyvault key create --vault-name cloud-shell-aws-cli --name aws-default-region --protection software
@Azure:~$ az keyvault secret set --vault-name cloud-shell-aws-cli --name aws-default-region --value ap-northeast-1

Key Vaultに登録した値の取得

登録した値の取得は以下でできます。

@Azure:~$ az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region
{
"attributes": {
"created": "2020-09-06T02:02:45+00:00",
"enabled": true,
"expires": null,
"notBefore": null,
"recoveryLevel": "Recoverable+Purgeable",
"updated": "2020-09-06T02:02:45+00:00"
},
"contentType": null,
"id": "https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region/28db5ad04abf4a1a92d43f7ae9cccae8",
"kid": null,
"managed": null,
"name": "aws-default-region",
"tags": {
"file-encoding": "utf-8"
},
"value": "ap-northeast-1"
}
@Azure:~$

このままだと扱いづらいので必要な値だけを取得します。

@Azure:~$ az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region --output tsv --query "[value]"
ap-northeast-1
@Azure:~$

余談となりますが、az keyvault secret showのパラメーターで必要なidhttps://[Key Vault名].vault.azure.net/secrets/[Key名]の書式ですが、以下のコマンドで取得することも可能です。

@Azure:~$ az keyvault secret list --vault-name cloud-shell-aws-cli
[
{
"attributes": {
"created": "2020-09-06T02:01:33+00:00",
"enabled": true,
"expires": null,
"notBefore": null,
"recoveryLevel": "Recoverable+Purgeable",
"updated": "2020-09-06T02:01:33+00:00"
},
"contentType": null,
"id": "https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-access-key-id",
"managed": null,
"name": "aws-access-key-id",
"tags": {
"file-encoding": "utf-8"
}
},
{
"attributes": {
"created": "2020-09-06T02:02:45+00:00",
"enabled": true,
"expires": null,
"notBefore": null,
"recoveryLevel": "Recoverable+Purgeable",
"updated": "2020-09-06T02:02:45+00:00"
},
"contentType": null,
"id": "https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region",
"managed": null,
"name": "aws-default-region",
"tags": {
"file-encoding": "utf-8"
}
},
{
"attributes": {
"created": "2020-09-06T02:01:44+00:00",
"enabled": true,
"expires": null,
"notBefore": null,
"recoveryLevel": "Recoverable+Purgeable",
"updated": "2020-09-06T02:01:44+00:00"
},
"contentType": null,
"id": "https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-secret-access-key",
"managed": null,
"name": "aws-secret-access-key",
"tags": {
"file-encoding": "utf-8"
}
}
]
@Azure:~$

ここまでで認証情報をKey Vaultに登録及び取得ができました。

なのでこれも.bashrcに登録しちゃいましょう。

@Azure:~$ echo 'export AWS_ACCESS_KEY_ID=`az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-access-key-id --output tsv --query "[value]"`' >> .bashrc
@Azure:~$ echo 'export AWS_SECRET_ACCESS_KEY=`az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-secret-access-key --output tsv --query "[value]"`' >> .bashrc
@Azure:~$ echo 'export AWS_DEFAULT_REGION=`az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region --output tsv --query "[value]"`' >> .bashrc
@Azure:~$
@Azure:~$ source .bashrc
@Azure:~$

動作確認

@Azure:~$ aws sts get-caller-identity
{
"UserId": "XXXXXXXXXXXXXXXXXXX",
"Account": "999999999999",
"Arn": "arn:aws:iam::999999999999:user/XXXXXXXXXX"
}

うまくいきました。

· 約7分
moritalous
お知らせ

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

AWS_CLI-v2.0.36 Azure_CLI-v2.11.0 AWS IoT CoreとAzure IoT HubでIoT機器からデータをアップロードするサンプルを試しました。

手順の比較

No.AWS IoT CoreAzure IoT Hub
(事前)-Azure CLIにエクステンションを追加する
(事前)-リソース グループを作成する
1-IoT Hubを作成する
2モノを作成するデバイスを作成する
3証明書を作成する-
4ポリシーを作成する-
5証明書にポリシーをアタッチする-
6証明書にモノをアタッチする-
7送信側のプログラムを作成する送信側のプログラムを作成する
  • AzureはIoT Hubそのものを作成する手順があります。
  • 認証方式がAWSはX.509 証明書、Azureは対称キーです。他の認証方式を使うと手順も変わると思います。

AWSの手順

モノを作成する

コマンド一発です。

aws iot create-thing --thing-name Thing001

証明書を作成する

パラメータで出力ファイル名を指定しています。

aws iot create-keys-and-certificate --certificate-pem-outfile "Cert001.cert.pem" --public-key-outfile "Cert001.public.key" --private-key-outfile "Cert001.private.key" --set-as-active

この先の手順で、実行結果に含まれる証明書のARN(certificateArn)が必要となりますのでメモっておきましょう。(下の実行結果はAWS CLIのリファレンスの例です)

実行結果
実行結果
{
"certificateArn": "arn:aws:iot:us-west-2:123456789012:cert/9894ba17925e663f1d29c23af4582b8e3b7619c31f3fbd93adcb51ae54b83dc2",
"certificateId": "9894ba17925e663f1d29c23af4582b8e3b7619c31f3fbd93adcb51ae54b83dc2",
"certificatePem": "
-----BEGIN CERTIFICATE-----
MIICiTCCEXAMPLE6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgEXAMPLEAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSEXAMPLE2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYEXAMPLEb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCEXAMPLEJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDAEXAMPLEsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEXAMPLE25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+aEXAMPLE
EXAMPLEfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZEXAMPLELG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAEXAMPLEWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9qEXAMPLEyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDEXAMPLEBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=
-----END CERTIFICATE-----\n",
"keyPair": {
"PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkEXAMPLEQEFAAOCAQ8AMIIBCgKCAQEAEXAMPLE1nnyJwKSMHw4h\nMMEXAMPLEuuN/dMAS3fyce8DW/4+EXAMPLEyjmoF/YVF/gHr99VEEXAMPLE5VF13\n59VK7cEXAMPLE67GK+y+jikqXOgHh/xJTwo+sGpWEXAMPLEDz18xOd2ka4tCzuWEXAMPLEahJbYkCPUBSU8opVkR7qkEXAMPLE1DR6sx2HocliOOLtu6Fkw91swQWEXAMPLE\GB3ZPrNh0PzQYvjUStZeccyNCx2EXAMPLEvp9mQOUXP6plfgxwKRX2fEXAMPLEDa\nhJLXkX3rHU2xbxJSq7D+XEXAMPLEcw+LyFhI5mgFRl88eGdsAEXAMPLElnI9EesG\nFQIDAQAB\n-----END PUBLIC KEY-----\n",
"PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nkey omittted for security reasons\n-----END RSA PRIVATE KEY-----\n"
}
}

ポリシーを作成する

まずポリシードキュメントを作成します。お試しなのでフルオープンですのでお気をつけください。

policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:*"
],
"Resource": [
"*"
]
}
]
}

次にポリシーを作成します。

aws iot create-policy --policy-name Policy001 --policy-document file://policy.json

証明書にポリシーをアタッチする

コマンド一発。証明書のARNは先の手順で取得したものです。

aws iot attach-policy --policy-name Policy001 --target "{証明書のARN}"

証明書にモノをアタッチする

こちらもコマンド一発。証明書のARNは先の手順で取得したものです。

aws iot attach-thing-principal --thing-name Thing001 --principal "{証明書のARN}"

送信側のプログラムを作成する

https://aws.amazon.com/jp/premiumsupport/knowledge-center/iot-core-publish-mqtt-messages-python/ にあるサンプルを使います。

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

pip install awsiotsdk

ソースコードの変更

変数名内容
ENDPOINT*1で取得できます
CLIENT_IDモノの名前(Thing001)
PATH_TO_CERTCERTのファイルパス(Cert001.cert.pem)
PATH_TO_KEYプライベートキーのファイルパス(Cert001.private.key)
PATH_TO_ROOTここのAmazonルートCA 1をダウンロード

*1 aws iot describe-endpoint --endpoint-type iot:Data-ATSコマンド

実行結果

20回送信したら終了します。

Connecting to xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com with client ID 'Thing001'...
Connected!
Begin Publish
Published: '{"message": "Hello World [1]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [2]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [3]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [4]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [5]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [6]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [7]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [8]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [9]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [11]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [12]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [13]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [14]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [15]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [16]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [17]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [18]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [19]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [20]"}' to the topic: 'test/testing'
Publish End

Azureの手順

Azure CLIにエクステンションを追加する

一部エクステンションが必要なコマンドがあるため、azure-iotエクステンションをインストールします。

az extension add --name azure-iot

リソース グループを作成する

IoT部分とは直接関係ありませんが、Azureの場合は必ずリソースグループが必要です。

az group create --name iot-resource-group --location japaneast

IoT Hubを作成する

コマンド一発。お試しなのでSKUはF1(無料)としてます。

az iot hub create --name iot-hub-00001 --resource-group iot-resource-group --partition-count 2 --sku F1

デバイスを作成する

コマンド一発

az iot hub device-identity create --hub-name iot-hub-00001 --device-id Device001

送信側のプログラムを作成する

https://github.com/Azure-Samples/azure-iot-samples-python/blob/master/iot-hub/Quickstarts/simulated-device/SimulatedDevice.py にあるサンプルを使います。

IoT Hub Device SDKのインストール

pip install azure-iot-device

ソースコードの変更

変数名内容
CONNECTION_STRING*2で取得できます

*2 az iot hub device-identity connection-string show --hub-name iot-hub-00001 --device-id Device001コマンド

実行結果

無限に続きます

IoT Hub Quickstart #1 - Simulated device
Press Ctrl-C to exit
IoT Hub device sending periodic messages, press Ctrl-C to exit
Sending message: {"temperature": 22.73671571030419,"humidity": 65.13300283503716}
Message successfully sent
Sending message: {"temperature": 21.122891449050375,"humidity": 75.35478976197727}
Message successfully sent
Sending message: {"temperature": 30.11015190710952,"humidity": 79.1313503131281}
Message successfully sent
Sending message: {"temperature": 29.056883680577876,"humidity": 74.9253608733604}
Message successfully sent
Sending message: {"temperature": 30.35374671931261,"humidity": 73.57241118544626}
Message successfully sent
Sending message: {"temperature": 33.336413834339076,"humidity": 65.31133008367256}
Message successfully sent
Sending message: {"temperature": 34.92260215374919,"humidity": 69.53101153342156}
Message successfully sent

確認方法について

AWSとAzureでメッセージが届いたか確認する方法が違ったので、紹介します。

AWSの場合

マネジメントコンソールのテストで確認できます。

image.png

Azureの場合

CLIコマンドで確認できます。

az iot hub monitor-events --hub-name iot-hub-00001 --device-id Device001
Starting event monitor, filtering on device: Device001, use ctrl-c to stop...
{
"event": {
"origin": "Device001",
"module": "",
"interface": "",
"component": "",
"payload": "{\"temperature\": 24.86829506815134,\"humidity\": 62.82101201700818}"
}
}
{
"event": {
"origin": "Device001",
"module": "",
"interface": "",
"component": "",
"payload": "{\"temperature\": 27.671191300371653,\"humidity\": 70.30860685264159}"
}
}
{
"event": {
"origin": "Device001",
"module": "",
"interface": "",
"component": "",
"payload": "{\"temperature\": 22.581311567865644,\"humidity\": 66.70979111038993}"
}
}
Stopping event monitor...

おしまい。

· 約6分
moritalous
お知らせ

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

※個人の調査によるものです。誤りがあればご指摘ください ※2020/8/8現在の情報をもとにまとめました。

AWSとAzureのリージョンなどの考え方を比較しました。

AWS

分類レベル名称定義
レベル小データセンター1つの物理的なデータセンター
レベル中アベイラビリティゾーン (AZ)1 つの AWS リージョン内でそれぞれ切り離され、冗長的な電力源、ネットワーク、そして接続機能を備えている 1 つ以上のデータセンターのことです。各 AZ はそれぞれ他の AZ から物理的に意味のある距離、つまり数キロメートル離れていますが、すべて 100 km 以内 (互いに 60 マイル) に配置されています。
レベル大リージョン1 つの地理的エリアにある、複数の、それぞれが隔離され物理的にも分離された AZ によって構成されています。1 つのデータセンターを 1 つのリージョンとして定義することが多い他のクラウドプロバイダーとは違い、全 AWS リージョンが採用するこのマルチ AZ デザインは、お客様にいくつかのメリットをご提供するものです。

大阪ローカルリージョンは特殊で、

  • 分離された耐障害性の高いインフラストラクチャデザインが 1 つのデータセンター内で構成されます。
  • アジアパシフィック (大阪) ローカルリージョンは 1 つのアベイラビリティーゾーンで構成されており、アジアパシフィック (東京) リージョンと組み合わせて使用することが意図されています。
  • このリージョンには、お客様のセールス担当者からのリクエストが必要です。

とのこと。

他にはLocal Zonesというものがあるようです。現在はロサンゼルスのみで提供されています。

https://aws.amazon.com/jp/about-aws/global-infrastructure/ https://aws.amazon.com/jp/about-aws/global-infrastructure/regional-product-services/ https://aws.amazon.com/jp/about-aws/global-infrastructure/regional-product-services/

Azure

分類レベル名称定義
Azure データセンターネットワークに接続されたコンピューター サーバーのグループを収容する、世界中に存在する一意の物理的な建物です。
Azure Availability ZonesAzure リージョン内の一意の物理的な場所であり、データセンターの障害からアプリケーションとデータを保護する高可用性を提供しています。それぞれのゾーンは、独立した電源、冷却手段、ネットワークを備えた 1 つまたは複数のデータセンターで構成されています。
Azure リージョンAzure リージョンは、待機時間で定義された境界内でデプロイされ、低遅延の専用リージョン ネットワークを使用して接続された一連のデータセンターです。
特大Azure 地域通常、1 つ以上のリージョンを含み、データ所在地とコンプライアンスの境界を保持します。

AWSにはない、「地域」というものが出てきました。リージョンも地域のような気もしますが、英語名はAzure リージョンがAzure regionで、Azure 地域がAzure geographyです。 東日本リージョンと西日本リージョンはペアに指定されているようで、このAzure 地域に該当するようです。

ペアになっているリージョンのメリットとしては、以下が上げらててました

  • 物理的な分離
  • プラットフォームに備わっているレプリケーション
  • リージョン復旧順序
  • 順次更新
  • データ所在地

https://azure.microsoft.com/ja-jp/global-infrastructure/ https://azure.microsoft.com/ja-jp/global-infrastructure/geographies/#geographies https://docs.microsoft.com/ja-jp/azure/best-practices-availability-paired-regions

日本国内リージョンの比較

比較項目AWS東京リージョンAWS大阪ローカルリージョンAzure東日本リージョンAzure西日本リージョン
開設時期2011年2018年2014年2014年
AZ数4131

調べていると、AWS東京リージョンに4つ目のリージョンが開設されたのが、2018年、Azure東日本リージョンがAZに対応したのが2019年のようです。この間はAWS東京リージョンが4AZ、Azure東日本リージョンが1AZとかなりの差があったような形ですね。 また、AWS大阪ローカルリージョンは2021年初頭までに3つのAZをもつフルリージョンになるようです。

https://aws.amazon.com/jp/blogs/news/the-fourth-new-availability-zone-tokyo-region/ https://azure.microsoft.com/ja-jp/updates/general-availability-azure-availability-zones-in-japan-east/ https://aws.amazon.com/jp/blogs/news/in-the-works-aws-osaka-local-region-expansion-to-full-region/

まとめ

AWS側のほうが知識があるので、AWS押しのような内容となりましたが、Azure側の押しポイントがあれば教えて下さい。