ECS Anywhereを用いてRaspberry PiにAWS CLIでのコマンド操作、パフォーマンスカウンターでメモリ等を計測をしてみた
おはようございます。ベンジャミンの木村です!
社内でRaspberry Piを触る機会があり、ECS Anywhereを用いてのRaspberry Piの初期設定を下記のとおりまとめましたので、ご紹介させていただきます!
- ECS AnywhereとRaspberry Piのセットアップ方法
- Raspberry Pi上でAWS CLIコマンドを実行する方法。
- パフォーマンスカウンターを使ったRaspberry Piのメモリやディスクの計測設定
Raspberry PiとAWSを組み合わせて触ってみたい方!
これを見れば、大抵のECS AnywhereとRaspberry Piの設定の方法がわかるようになっておりますので、少々長くなっておりますが、拝見いただければと思います。
環境
- Raspberry Pi:バージョン4
- OS:22.04.3 LTS(64-bit)
※こちらのバージョンは2024年1月19日時点での情報です。
準備物
- PC
- Raspberry Pi
- 外付け キーボード
- 外付け マウス
- 外付け スクリーン
目次
- ECS Anywhereとは?
- Raspberry Piとは?
- 1. Raspberry Piの組み立て方法
- 2. Raspberry Piの初期セットアップ
- 3. ローカルPCよりRaspberry PiへSSHする
- 4. Amazon ECS Anywhere(クラスター)の構築
- 5. ECS AnywhereとRaspberry Piの接続
- 6. Amazon ECS Anywhereのタスク定義を作成
- 7. Amazon ECS Anywhereのサービスを作成
- 8. Raspberry PiからAWS CLIを実行できるようにする
- 9. SystemManager Run CommandでRaspberry PiからAWS CLIを実行できるようにする
- 10. Raspberry Piへのパフォーマンスカウンター(計測)の設定
- まとめ
ECS Anywhereとは?
Amazon ECS Anywhereはオンプレミス等の外部の仮想サーバーを Amazon ECS クラスターのインスタンスとして登録し、AWSからのコンテナ環境の提供、AWSコンソール上からの操作、パフォーマンスの計測を行えるようにするサービスとなります。
EC2のECSインスタンスをオンプレミス上で立ち上げているイメージとなります。
以下に、AWS公式ページから提供されている、Amazon ECS Anywhere のシステムアーキテクチャの概要を表示します。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-anywhere.html
Raspberry Piとは?
Raspberry Piはワンボードマイコンと呼ばれるいわゆる小さなパソコンです。当初は教育用に使える安価なコンピュータとして開発されましたが、現在、産業界ではIoTが注目を集め、活用が広まっています。
手順
1. Raspberry Piの組み立て方法
1-1. 下記写真のとおりに、放熱用のヒートシンクを3箇所取り付ける
↓
1-2. カバーを取り付ける
1-3. 上部蓋に冷却ファンを取り付ける。(ネジも必要に応じて取り付ける)
1-4. 冷却ファンの赤線、黒線を下記写真の通りに取り付ける
(赤線は下側の左から1番目、黒線は上側の左から3番目)
1-5. 1-2に冷却ファンがついた1-3のカバーを取り付け完成
2. Raspberry Piの初期セットアップ
2-1. マイクロSDを専用のカードリーダーに差し込み、タイプCの差し込み口をMAC PCに差し込む
2-2. 下記URLをクリックし、Raspberry Piのダウンロードページに移動する
https://www.raspberrypi.com/software/
2-3. PCのOSに合わせてDownloadボタンをクリックする
2-4. ダウンロード後アプリケーションフォルダに入っているので、クリックする。
2-5. 表示された画面で「デバイスを選択」のボタンをクリックする
2-6. 項番1で組み立てたRaspberry Piのバージョンを選択する
※こちらのバージョンは2024年1月19日時点での情報です。
2-7.「OSを選択」のボタンをクリックする
2-8.「Other general-purpose OS」をクリックする
2-9. 「Ubuntu」をクリックする
2-10. 「Ubuntu Server 22.04.3 LTS(64-bit)」を選択する
※こちらのバージョンは2024年1月19日時点での情報です。
2-11. 「ストレージを選択」をクリックする
2-12. 項番2-1でMac PCに挿入したマイクロSDを選択する
2-13. 「次へ」をクリックする
2-14. 「設定を編集する」をクリックする
2-15. 以下画像のとおりに、一般設定を行う。
- Wifiは自動でパスワード設定が行われる
- ユーザー名、パスワードはUbuntuのログイン時に必要になる
- タイムゾーン/キーボードレイアウトは自身の環境に合わせる
※キーボードレイアウトを合わせないとUSキーボードになってしまうので注意。(私はUSレイアウトになっていることに気づかず、記号の位置が変わっていて、パスワードがなかなか通りませんでした‥)
2-16. サービスタブをクリックし、Raspberry PiにSSHするために、Raspberry Pi上に設置する公開鍵を下記黒塗の部分にコピー&ペースとする
(「SSH-KEYGENを実行する」をクリックすると、自動で.sshに秘密鍵(id_rsa)、公開鍵(id_rsa.pub)が作られ、黒塗の部分に公開鍵の情報が記載される。)
ローカルPC上に公開鍵の設定する方法は下記をご参照ください
https://qiita.com/soma_sekimoto/items/35845495bc565c38ae9d
2-17. オプションタブをクリックし、以下画像の通りにチェックを入れ、「保存」ボタンをクリックする。
2-18. 「User OS customization」の画面で、「はい」のボタンをクリックし、Raspberry Piのセットアップを待ち完了。(セットアップが完了されるまで15分ほどかかります)
※セットアップが途中で失敗する場合があります。その場合は再度設定を確認し、項番2-18の「はい」のボタンをクリックするとセットアップが実行されます。
3. ローカルPCよりRaspberry PiへSSHする
3-1. 項番2-1で使用したマクロSDをRaspberry Piに差し込む
3-2. Raspberry Piに以下3点を接続する
- マウス
- キーボード
- スクリーン
3-3. Raspberry Piの電源を入れ、スクリーンに表示された画面でログイン操作し、下記コマンドを入力する
kimuranaoki@ubuntu:~$ hostname -I
192.168.3.30 172.17.0.1 2400:2412:741:d900:da3a:ddff:fe25:2f30
コマンドによって表示されたプライベートIP(上記だと192.168.3.30
)の部分を控える。
3-4. ローカルからSSHコマンドを実行する
ssh -i キーファイル.pem user@IPアドレス
下記のように表示されれば完了
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-1044-raspi aarch64)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Last login: Mon Jan 22 16:54:38 2024 from 192.168.3.25
kimuranaoki@ubuntu:~$
4. Amazon ECS Anywhere(クラスター)の構築
4-1. 下記URLよりECSのコンソール画面へ移動
https://ap-northeast-1.console.aws.amazon.com/ecs
4-2. 表示された画面で「クラスターの作成」をクリックする
4-3. 以下画面の通りに必要事項を記載し、「作成」ボタンをクリックする
- クラスター名:任意の名前
- デフォルトの名前空間:任意の名前(クラスター名が入力されると自動で入力されます)
- インフラストラクチャ:「ECS Anywhere を使用した外部インスタンス」を選択する
4-4. 作成したECSクラスターの画面に移動し、「インフラストラクチャ」のタブ →「外部インスタンスを登録」ボタンをクリックする。
4-5. 以下画面の通りに必要事項を記載し、「登録コマンドの生成」ボタンをクリックする。生成されたコマンドは控える。
- アクティベーションキーの有効期間 (日数):1
- インスタンス数:1
- インスタンスロール:新規作成
※新規作成を行うとecsExternalInstanceRoleが作成されます。
下記のようなコマンドが生成される
curl --proto "https" -o "/tmp/ecs-anywhere-install.sh" "<https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh>" && bash /tmp/ecs-anywhere-install.sh --region "<リージョン>" --cluster "<クラスター名>" --activation-id “<Activation Id>" --activation-code "<Activation Code>"
5 . ECS AnywhereとRaspberry Piの接続
5-1. ローカルからRaspberry PiにSSHする
kimuranaoki@kimuranaokinoMacBook-Pro .ssh % ssh <項番3-5で記載したHost>
5-2. cmdline.txtファイルを編集する
**kimuranaoki@ubuntu**:**~**$ vi /boot/firmware/cmdline.txt
下記の通りcgroup_enable=memory cgroup_memory=1
を末尾につける
- console=serial0,115200 dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash cfg80211.ieee80211_regdom=JP
+ console=serial0,115200 dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash cfg80211.ieee80211_regdom=JP cgroup_enable=memory cgroup_memory=1
5-3. 再起動する
kimuranaoki@ubuntu:~$ sudo reboot
5-4. 再びローカルからSSHする
kimuranaoki@kimuranaokinoMacBook-Pro .ssh % ssh <項番3-5で記載したHost>
5-5. 4-5でECSコンソール上で生成したコマンドを実行する
kimuranaoki@ubuntu:~$ curl --proto "https" -o "/tmp/ecs-anywhere-install.sh" "<https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh>" && sudo bash /tmp/ecs-anywhere-install.sh --region "<リージョン>" --cluster "<クラスター名>" --activation-id “<Activation Id>" --activation-code "<Activation Code>"
※上記コマンドを実行するためにroot権限が必要なので&& bash
のところを&& sudo bash
に置き換えて実行します。
実行に成功すると下記のものがインストールされます。
- AWS Systems Manager Agent
- Amazon ECS コンテナエージェント
- Docker
5-6. しばらくすると下記のようにECS上にコンテナインスタンスが登録される
※登録されるまで15分ほどかかる時がある
6. Amazon ECS Anywhereのタスク定義を作成
6-1. ECSのコンソールより、左ペインの「タスク定義」→「新しいタスク定義の作成」→「JSON を使用してタスク定義を作成」をクリックする
6-2. 下記JSONの内容を貼り付けて、「作成」ボタンをクリックする
{
"family": "<タスク定義名>",
"containerDefinitions": [
{
"name": "<コンテナ名>",
"image": "<ECRのURI>",
"cpu": 0,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"essential": true,
"environment": [],
"mountPoints": [],
"volumesFrom": [],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-create-group": "true",
"awslogs-group": "/ecs/nginx-test-bridge",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
}
}
],
"executionRoleArn": "<ECSのIAMロールのARN>",
"networkMode": "bridge",
"requiresCompatibilities": [
"EXTERNAL"
],
"cpu": "1024",
"memory": "3072"
}
例) nginxの初期画面を表示するタスク定義(上記に下記を追加)
- タスク定義名:nginx
- コンテナ名:nginx
- ECRのURI:public.ecr.aws/nginx/nginx:latest
- ECSのIAMロールのARN:arn:aws:iam::<アカウントID>:role/ecsTaskExecutionRole
6-3. タスク定義が作成されていることを確認して完了。
7. Amazon ECS Anywhereのサービスを作成
7-1. 項番4で作成したクラスターの画面へ移動する。「サービス」タグ→「作成」ボタンをクリックする
7-2. 以下の通りに値を設定し、「作成」ボタンをクリックする。
- 起動タイプ:EXTERNAL
- アプリケーションタイプ:サービス
- タスク定義:項番6で作成したタスク定義
- サービス名:任意の名前
- 必要なタスク:1
※他はデフォルトでOK
7-3. サービスのステータスが「アクティブ」になることを確認する
7-4. 項番3-3で確認したRaspberry PiのプライベートIPをブラウザで入力し、目的の画面が表示されるか確認する。
※私のようにコンテナにnginxを入れているだけならば、nginxの初期画面が表示されます。
8. Raspberry PiからAWS CLIを実行できるようにする
8-1. 下記URLを参考にIAMユーザー、アクセスキーを作成する
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html
IAMユーザーへつける権限は実行したいAWS CLIの権限をつける。
(例:S3バケットへの権限(AmazonS3FullAccess))
8-2. Raspberry PiにSSHする
kimuranaoki@ubuntu:~$ kimuranaoki@kimuranaokinoMacBook-Pro .ssh % ssh <項番3-5で記載したHost>
8-3. AWS CLIのZIPファイルのインストール
kimuranaoki@ubuntu:~$ curl "<https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip>" -o "awscliv2.zip"
8-4. AWS CLIのZIPファイルの解凍
kimuranaoki@ubuntu:~$ unzip awscliv2.zip
8-5. 解凍したファイルのアップデートを実行
kimuranaoki@ubuntu:~$ sudo ./aws/install --update
8-6. アップデートしたファイルをインストール
kimuranaoki@ubuntu:~$ sudo ./aws/install
8-7. AWS CLIがインストールされているか確認
kimuranaoki@ubuntu:~$ aws --version
aws-cli/2.15.12 Python/3.11.6 Linux/5.15.0-1044-raspi exe/aarch64.ubuntu.22 prompt/off
8-8. AWS Configureの設定を行う
アクセスキーID、シークレットキーは項番8-1で作成したIAMユーザーのものを使用する
kimuranaoki@ubuntu:~$ aws configure
AWS Access Key ID [None]: <アクセスキーID>
AWS Secret Access Key [None]: <シークレットアクセスキー>
Default region name [None]: ap-northeast-1
Default output format [None]: json
8-9. AWS CLIを実行してみる
下記はアカウント内のS3バケットを確認するコマンド。アカウント内のバケット名が表示されれば、完了
kimuranaoki@ubuntu:~$ aws s3 ls
9. System Manager Run CommandでRaspberry PiからAWS CLIを実行できるようにする。
こちらの設定をなぜ行うかというと、AWS CLIをRaspberry Piで使用できれば、Raspberry PiからAWSのデータを取得または渡すときに便利だからです。
ちなみに項番8までのECS Anywhereのセットアップが完了した時点で、System Manager Run CommandをRaspberry Piに対して実行することは可能です。
試しに少し手順を飛ばし、以下項番9-5から作業を開始し、9-7のコマンド入力でcurl https://google.com
と実行してみると、Raspberry Pi上で実行した時と同じ実行結果が得られると思います。
9-1. 作成したクラスターの画面へ移動し、「インフラストラクチャ」のタブ→「インスタンスID」をクリックする
9-2. 表示された画面のインスタンスロールを控える
9-3. 下記URLよりIAMのコンソール画面へ移動する
https://us-east-1.console.aws.amazon.com/iam
9-4. 項番9-2で控えたIAMロールにAWS CLIの実行に必要な権限をアタッチする
IAMロールへつける権限は実行したいAWS CLIの権限をつける。
(例:S3バケットへの権限(AmazonS3FullAccess))
9-5. 下記画面より、System Managerのコンソール画面へ移動
https://ap-northeast-1.console.aws.amazon.com/systems-manager
9-6. 左ペインの「Run Command」→「Run Command」ボタンをクリックする。
9-7. 以下写真のとおりに値を設定し、「実行」ボタンをクリックする。
- コマンドドキュメント:AWS-RunShellScript
- コマンドパラメータ:実行したいAWS CLIコマンド
- ターゲット:インスタンスを手動で選択する
- インスタンス:項番9-1で選択肢たコンテナインスタンスID
- 出力オプション:S3バケットへの書き込みを有効化のチェックを外す
9-8. ステータスが「成功」になれば、対象の「インスタンスID」を選択し、「出力の表示」のボタンをクリックする。
9-9. Outputの出力内容が目的のものであれば完了
(aws s3 lsならアカウント内のバケット名の一覧が並ぶ )
10. Raspberry Piへのパフォーマンスカウンター(計測)の設定
こちらを設定することでRaspberry PiのCPU使用率、メモリ使用率、ディスク使用率、ネットワークトラフィックを計測することができます。CloudWatchなどで閾値を設定してアラートを飛ばすまではないけれど、CPUなどの状態をサクッとみたい時に便利です。
10-1. 下記URLよりKMSのコンソール画面へ移動する
※パフォーマンスカウンターを起動するためにKMSが必要になる
https://ap-northeast-1.console.aws.amazon.com/kms
10-2. 左ペインの「カスタマー管理型のキー」→「キーの作成」ボタンをクリックする
10-3. 以下写真のとおりに値を設定し、「次へ」ボタンをクリックする。
- キータイプ:対照
- キーの使用法:暗号化および複合化
- 詳細オプション:KMS
- リージョンごと:単一リージョン
10-4. 以下写真のとおりに値を設定し、「次へ」ボタンをクリックする。
- エイリアス:任意の名前
10-5. 以下写真のとおりに値を設定し、「次へ」ボタンをクリックする。
- キー管理者:設定不要
10-6. 以下写真のとおりに値を設定し、「次へ」ボタンをクリックする。
- キーユーザー:設定不要
10-7. 設定値を確認し、「完了」ボタンをクリックする
10-8.下記JSONファイルを参考に IAMポリシーを作成し、項番9-2で確認したECSのIAMロールにアタッチする。
※IAMポリシーの作成、ロールへのアタッチは下記を参考にする
※IAMポリシーは<KMSのARN>の記載が必要
IAMポリシーの作成
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_create-console.html
IAMポリシーをロールにアタッチ
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetEncryptionConfiguration"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": "<KMSのARN>"
}
]
}
10-9. 下記URLよりSystemManagerのコンソール画面へ移動する
https://ap-northeast-1.console.aws.amazon.com/systems-manager
10-10. 左ペインの「セッションマネージャー」→「設定」タブ→「編集」ボタンをクリックする
10-11. 以下写真のとおりに値を設定し、「保存」ボタンをクリックする
- Enable KMS encryption:有効
- Select a KMS key:選択
- KMS key:項番10-7で作成したKMS
10-12. 左ペインの「フリートマネジャー」→「設定」→「インスタンスの設定を変更」をクリックする
10-13. 確認事項にチェックを入れ、「設定を変更」をクリックする
※料金は執筆時点で0.00695USD/インスタンス/時間となっているので、使用しない時はスタンダードに戻しておいてください。
料金の詳細は下記をご覧ください。
https://aws.amazon.com/jp/systems-manager/pricing/
10-14. 計測したい対照のノードID(項番5-6で登録されたインスタンスID)をクリックする
10-15. 左ペインの「パフォーマンスカウンター」をクリックするとCPU、ディスク、トラフィック、メモリのメトリクスが表示されます。
まとめ
以上でECS Anywhereを用いたRaspberry Piを操作になります。
ECS Anywhereを用いることで、Raspberry Piのような外部のコンピューターへのコンテナ配置、操作、パフォーマンスの計測をすることが可能になりました。配線作業などの物理を伴う作業以外は、データセンターでの作業も、自宅から行える日が近いのでは…?と思いました。
少し長かったと思いますが、お付き合いくださりありがとうございました!