BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Ansible・Raspberry Pi・AWS】ラズパイ4にSSMエージェントを導入する

f:id:bftnagoya:20210824205832p:plain

はじめに

こんにちは!
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

docs.aws.amazon.com

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の管理コンソールのメニューで [ ハイブリッドアクティベーション ] を選択し、[ アクティベーションの作成 ] を行うだけです。

ポイントはオプションになっているインスタンス名をきちんと入力することでしょうか。これを入れないと実際に接続する際に迷います。
f:id:bftnagoya:20210824200840p:plain:w550

また、アクティベーションを削除してもセッションマネージャで接続する際に過去接続したものは接続対象として(おそらく一定期間)表示されるのでむやみにたくさんアクティベーションを作成するとどれに接続すべきかわからなくなってしまうため注意しましょう。

アクティベーションの作成が成功すると、アクティベーションコードとアクティベーション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/.yml

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エージェントを導入して遠隔操作を行う方法でした~