はじめに
こんにちは!
BFT名古屋支店・インフラ女子(?)のやまぐちです。
今回はIoTデバイスを遠隔操作したい!という一心でラズパイ4(64bit)にSSMエージェントを導入した方法を記載したいと思います。
ラズパイ4にSSMエージェントを入れる
実は2021/8/24現時点では、ラズパイのOS(raspberry Pi OS)だとARM 32bitのOSのみサポートされています。そのため、本記事に記載されていることは自己責任で実施してください。
前提条件
AWS Systems Managerで使うのはセッションマネージャのみですが、要件はSystems Managerを参照します。
Systems Manager の前提条件 - AWS Systems Manager
Raspberry Pi OSの欄で確認するとバージョン9(stretch)のARM 32-bit (arm)がサポートされている最新ということが分かります。
使っているRaspberry Pi OSはベータ版である64bit。SSMエージェントが正式にサポートされていないのも致し方ありません。ちなみに64bitOSは以下のリンクから取得し、MicroSDに書き込んでいます。
Index of /raspios_arm64/images
このOSを入れるとバージョン10(buster)のARM 64bit(arm)が入ります。ここで目を付けたのはサポートOSの中のDebianの項目です。バージョン10(buster)のARM 64-bit (arm64)にチェックが入っているので、このエージェントをラズパイに入れます。
なお、ラズパイ4は8GBメモリを使っています。4GB版でも問題はありません。
SSMエージェントの導入① ハイブリッドアクティベーション
オンプレの機器へSSMエージェントを導入する場合、このハイブリッドアクティベーションという操作が必要になります。操作は簡単、Sysmtems Managerの管理コンソールのメニューで [ ハイブリッドアクティベーション ] を選択し、[ アクティベーションの作成 ] を行うだけです。
ポイントはオプションになっているインスタンス名をきちんと入力することでしょうか。これを入れないと実際に接続する際に迷います。
また、アクティベーションを削除してもセッションマネージャで接続する際に過去接続したものは接続対象として(おそらく一定期間)表示されるのでむやみにたくさんアクティベーションを作成するとどれに接続すべきかわからなくなってしまうため注意しましょう。
アクティベーションの作成が成功すると、アクティベーションコードとアクティベーションIDがWeb画面に表示されます。
必ずコピーしてローカルのテキストなどに保存しておいてください。これを忘れるとアクティベーションの作成をやり直しするしか道はありません。
SSMエージェントの導入② エージェントのインストール (Ansible版)
ラズパイは可能な限り自動構築するようにしており、SSMエージェントの導入もその対象となっています。ここではroles配下に用意したSSMエージェントを導入するためのロールSSMagentのtasks以下main.ymlをご紹介します。
roles/SSMagent/tasks/main.yml
- name: mkdir /tmp/ssm file: path: /tmp/ssm state: directory - name: check ssm agent if exist. become: yes shell: cmd: dpkg-query -l | grep amazon-ssm-agent register: ssmagent ignore_errors: yes - name: download ssm agent. become: yes shell: curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm/amazon-ssm-agent.deb -o /tmp/ssm/amazon-ssm-agent.deb when: ssmagent.rc == 1 - name: install ssm agent. become: yes shell: cmd: dpkg -i /tmp/ssm/amazon-ssm-agent.deb when: ssmagent.rc == 1 - name: set activation code&ID of SSM agent. become: yes shell: cmd: amazon-ssm-agent -register -code "{{ ssmactcode }}" -id "{{ ssmactid }}" -region "ap-northeast-1" register: activate when: ssmagent.rc == 1 - name: start ssm agent. systemd: name: amazon-ssm-agent state: started when: ssmagent.rc == 1 and activate.rc == 1 - name: delete /tmp/ssm file: path: /tmp/ssm state: absent
このPlaybookはhost_vars以下にホストごとの変数ファイルを作成しており、そこに①で発行したアクティベーションコードとアクティベーションIDを記載しています。
host_vars/
ssmactcode: "XXXXXXXXXXXX" ssmactid: "XXXXXXXXXXXX"
playbookは難しいことをしていないので、手動の場合はそのままコマンドを実行していけば同様にインストール可能です。アクティベーションコードとアクティベーションIDのみ指定するのを忘れないようにしてください。
mkdir /tmp/ssm curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm/amazon-ssm-agent.deb -o /tmp/ssm/amazon-ssm-agent.deb dpkg -i /tmp/ssm/amazon-ssm-agent.deb amazon-ssm-agent -register -code "<ssmactcode>" -id "<ssmactid>" -region "ap-northeast-1" systemctl retstart amazon-ssm-agent rm -fr /tmp/ssm
動作確認
インストールが終わったら早速セッションマネージャから接続できるか確認します。接続できれば問題なし、できなければ以下のログファイルからトラブルシュートしてください。
/var/log/amazon/ssm/amazon-ssm-agent.log
私たちの環境だと時刻同期がうまくいっていない場合に接続できないということはありました。また、アクティベーションコードとアクティベーションIDの有効期限は指定しない場合に24時間なので、有効期限が切れてしまうとエラーが発生し、再度アクティベーションを作成しなければいけません。
終わりに
点在するIoTデバイスの管理に遠隔で操作する仕組みは必要不可欠です。まだ定形の作業がない今はIoTデバイスへログインしてコマンドを実行できれば構いません。
今後実行することが決まっていったらAWS IoTの機能、Systems ManagerのRunCommand、Node-REDなどで実装することも考えていけばいいかなと思います。
以上、ラズパイ4の64bit OSにSSMエージェントを導入して遠隔操作を行う方法でした~