ECS Anywhereを用いてRaspberry PiにAWS CLIでのコマンド操作、パフォーマンスカウンターでメモリ等を計測をしてみた

technologies

  • HOME
  • BLOG
  • technologies
  • 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とは?

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ポリシーをロールにアタッチ

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_job-functions_create-policies.html

{
"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のような外部のコンピューターへのコンテナ配置、操作、パフォーマンスの計測をすることが可能になりました。配線作業などの物理を伴う作業以外は、データセンターでの作業も、自宅から行える日が近いのでは…?と思いました。

少し長かったと思いますが、お付き合いくださりありがとうございました!

Related posts