AWS

Tips

(注意) 以下の記述は VPC や SSM 用 VPC エンドポイントなどをすべて自分で作成していくような記述である。個人のアカウントでない場合は運用ルールにしたがい作成済みのものを使用するなどする。

VPC を作成する

VPC を自分で作成する場合は作成する (なお、AWS アカウントを私的に取得すると既に VPC が作成されているので、組織で発行したアカウントに VPC がないという場合は組織ポリシーによるもののようである)。
  • VPC ダッシュボードに移動し「VPC を作成」をクリックする。特に目的がなければ以下のように設定すれば、IP アドレス 32 個の VPC が作成され、その前半がパブリックサブネット、後半がプライベートサブネットになる (インスタンスは原則プライベートサブネットに作成する)。
    • 作成するリソース: VPC など
    • 名前タグ: (好きな名前)
    • IPv4 CIDR: 10.0.0.0/27
    • パブリックサブネットの数 : 1
    • プライベートサブネットの数 : 1
    • NAT ゲートウェイ : 1 AZ 内 / なし
      • NAT ゲートウェイは、プライベートサブネットとインターネット間の直接通信を防ぎ、通信を一元管理するために作成すべきである。ただ、設定画面にあるように NAT ゲートウェイは有料で、何もしていなくても時間課金 ($0.062/h@東京) + データを通信すれば従量課金 ($0.062/GB@東京) があり [1]、インスタンスにインターネットから巨大データを取得するときなどは注意する必要がある。
      • NAT ゲートウェイを作成せずにプライベートサブネット内のインスタンスからのインターネットアクセスを可能にするには、後からプライベートサブネットのルートテーブルに「送信先: 0.0.0.0/0」「ターゲット: インターネットゲートウェイ」を追加する。但しこの方法だと、
        • もはやプライベートサブネットではなくなり、セキュリティリスクがある。
        • この方式では基本的にインスタンスにパブリック IP アドレスを割り当てないとインスタンスからインターネットへのアウトバウンド通信も上手くいかない。2023年12月現在では、インスタンスへのパブリック IP の自動割り当てや、稼働中インスタンスへの Elastic IP の割り当ては無料だが、2024年2月からこれも有料になる (ただ $0.005/h である) [2]。

参考文献

  1. 料金 - Amazon VPC | AWS. (2023年12月9日参照).
  2. 新着情報 – パブリック IPv4 アドレスの利用に対する新しい料金体系を発表 / Amazon VPC IP Address Manager が Public IP Insights の提供を開始 | Amazon Web Services ブログ. (2023年12月9日参照).

インスタンスを作成する

項目 説明 選び方
Application and OS Images (Amazon Machine Image) OS (及びプリインストールするアプリケーション) である。 用途に応じて選ぶ。ただし、イメージによってはそれに合ったインスタンスタイプを選ばなければならないので注意する。また、選ぼうとしなければ選ぶことはないと思うが Marketplace AMI は有償であるので注意する。
インスタンスタイプ CPU コア数、RAM 容量、必要ならば GPU 数を決定する (個別に指定するのではなくその組合せからなるインスタンスタイプを選択する)。 用途に応じて選ぶ。このスペックに対してインスタンス稼働時間に応じて課金される (インスタンスタイプによっては無料利用枠もある) ので、その AWS アカウントにお金を出している人と相談して選択する。
ネットワーク設定 > ネットワーク、サブネット インスタンスを設置するサブネットである。設置するサブネットによってどこにどこ経由でアクセスできるかが決まる。 個人アカウントの場合は最初のインスタンス作成前に自分で VPC 及びサブネットを作成する (明示的に作成しなくても作成されると思うが作成しておくとよいと思われる)。組織アカウントの場合は運用ルールにしたがう。
ネットワーク設定 > セキュリティグループ インスタンスからどこへのアクセスを許可するか、どこからインスタンスへのアクセスを許可するかのルール群である。 既存のセキュリティグループがなければデフォルトで勝手に作成されるし後から適宜変更もできる。ただ既に作成済のものの流用でよければそれが便利である。組織アカウントの場合は運用ルールにしたがう。
高度な詳細 > IAM インスタンスプロフィール インスタンスが AWS 上のサービス (S3 や SSM) を利用できるかの権限の設定である。 デフォルトでは設定されないが後から適宜プロフィールを作成して設定したり、既存のプロフィールを設定したりできる。組織アカウントの場合は運用ルールにしたがう。

インスタンスにセッションマネージャー経由で接続する

インスタンスに以下の設定をすればセッションマネージャー接続のボタンが押せるようになるはずである (インスタンス作成後でもよい) (設定の反映には多少タイムラグがある)。
  • インスタンスの IAM ロールに、「AmazonEC2RoleforSSM」を含む IAM インスタンスプロフィールを割り当てる (まだ IAM インスタンスプロフィールがないなら、誘導にしたがってクイックセットアップすればこのロールを含めるようにできるはずである)。
  • インスタンスのあるサブネットに SSM 用 VPC エンドポイントを未作成の場合は作成する。
    • VPC ダッシュボードのサイドバーから「セキュリティグループ」を選択、「セキュリティグループを作成」を押下し、インバウンドルールに、「タイプ:HTTPS」「ソース:インスタンスのセキュリティグループ」を追加する。
    • VPC ダッシュボードのサイドバーから「エンドポイント」を選択し、画面右上の「エンドポイントを作成」を押下し、サービスの検索フォームに .ssm と入力して com.amazonaws.[リージョン名].ssm を探し当て選択する。続けてインスタンスのある VPC とサブネットを選択し、最後に「セキュリティグループ」で先ほど作成したセキュリティグループを選択してエンドポイントを作成する。com.amazonaws.[リージョン名].ssmmessages, com.amazonaws.[リージョン名].ec2, com.amazonaws.[リージョン名].ec2messages に対しても同様に作成する。

インスタンスからインターネットにアウトバウンド接続する

インスタンスからインターネットにアウトバウンド接続したい場合 (Ex. Python やそのパッケージのインストール)、以下の設定が必要である (インスタンス作成後でもよい)。
  • インスタンスのセキュリティグループのアウトバウンドルールに、「送信先: 0.0.0.0/0」への許可を追加する (自動作成されたセキュリティグループではデフォルトで許可されている)。
  • インスタンスのあるサブネットのルートテーブルに、「送信先: 0.0.0.0/0」「ターゲット:NAT ゲートウェイ (またはインターネットゲートウェイ)」を追加する。
  • 上記の設定で理論上はインターネットにアクセスできる (設定の反映には多少タイムラグがある) はずである。が、上手くいかない場合は、インスタンスにパブリック IP アドレスを割り当てると上手くいくことがある。例えば EC2 ダッシュボードのサイドバーから「Elastic IP」を選択して作成しインスタンスに割り当てることができる。

GPU インスタンスを利用する

  • インスタンス作成時に例えば参考文献 [1] のような AMI (Amazon Machine Image) を選択すると GPU 機械学習環境をプリインストールしてくれる (はずである)。ただし、インスタンスタイプも GPU 系を選択しなければならない。かつ、その AMI がサポートしているインスタンスタイプでなければプリインストールが効かない。例えば [1] のリリースノートによると、P2 系インスタンスはサポートしていない。また、サポートされている場合でも GPU と連携しているのは Conda 仮想環境の Python であるなどが [1] にあるのでちゃんとリリースノートを読むこと。
    • 私は仮想環境の Python が GPU と連携しているのに気付かずシステム環境に GPU 連携 Python を構築してしまったが、こうしてしまうと時間とディスク容量を浪費する。
  • サポートされていない組合せでインスタンスを作成してしまった場合でも、Ubuntu AMI であれば [2] の記事にしたがえばコマンド
    nvidia-smi
    を通せる (セッションマネージャーから接続している場合、再起動は管理画面から行う)。そうなれば後は [3] にしたがえば PyTorch for CUDA が入る。なお、2023年12月9日現在に [2] の記事にしたがうと CUDA 12.2 が入ってしまい、[3] でサポートされている CUDA 12.1 と食い違ってしまうが、こちらがやや新しい分にはたぶん何とかなる。何とかならなくなったら対処すること。

参考文献

  1. AWS Deep Learning AMI GPU PyTorch 2.1 (Ubuntu 20.04). (2023年12月9日参照).
    • Supported EC2 Instances: P5, P4de, P4d, P3, G5, G3, G4dn (P2 is not supported)
    • Python: /opt/conda/envs/pytorch/bin/python
  2. EC2のGPUインスタンスにNvidiaドライバーとnvidia-dockerを利用してdockerコンテナ内にpython,cuda,cuDNNを導入する - Qiita#3-gpu環境構築. (2023年12月9日参照).
  3. Start Locally | PyTorch. (2023年12月9日参照).

同じサブネット内のインスタンス B からインスタンス A にアクセスする

# ----- インスタンス B からインスタンス A にアクセスしたいとき -----
# 以下ではインスタンス A のプライベート IPv4 アドレス: 172.16.0.25
# 以下ではインスタンス B のプライベート IPv4 アドレス: 172.16.0.21

# (1) インスタンス B に行ってやること
ssh-keygen -t rsa  # パスフレーズも訊かれるので決める
cat ~/.ssh/id_rsa.pub  # この内容をコピー

# (2) インスタンス A に行ってやること
mkdir ~/.ssh/
vi ~/.ssh/authorized_keys  # ここにペースト
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# (3) インスタンス A の管理画面に行ってやること
# セキュリティグループのインバウンドルールで
# - タイプ:SSH
# - ソース:インスタンス B のプライベート IPv4 アドレス (172.16.0.21/32) 
# を許可

# (4) インスタンス B に行ってやること
ssh ssm-user@172.16.0.25  # インスタンス A にアクセスできる
scp ssm-user@172.16.0.25:~/aaa/bbb/*.npy ~/ccc/ddd/  # インスタンス A からものを取り寄せられる

参考文献

  1. 異なるEC2インスタンス間でssh接続する - 箱のプログラミング日記。. (2023年12月9日参照).

ディスク容量を大きくする

参考文献 [1] にしたがって管理画面からボリュームのサイズを拡大した後、インスタンスにて例えば以下のような作業を行う (以下は Ubuntu の場合) (ブロックデバイス名とファイルシステム名は異なる場合がある)。
lsblk -fip  # xvda 以下の1つ目のブロックデバイス (マウントポイント / ) のサイズが大きくなっていない
sudo growpart /dev/xvda 1
lsblk -fip  # 大きくなっている

df -hT  # ファイルシステム /dev/root (マウントポイント / ) のサイズが大きくなっていない
sudo resize2fs /dev/root
df -hT  # 大きくなっている

参考文献

  1. AWS EC2インスタンスのディスク容量(EBSボリュームサイズ)を増やす方法. (2023年12月11日参照).