はじめに
こんばんwifi
motoを使用してAWSサービスをmockする手順を
自分用の備忘録として
初心者用に書き記したいと思います。
今回はEC2をローカル上で作成し、
そのインスタンスIDを取得するというテストを実施していこうと思います。
まずmockって何?
"モックオブジェクト"という言葉は、テストのために本物のオブジェクトをまねる特殊なオブジェクトを表す言葉らしいです。
テストやコンパイル用に用意されたダミーのクラスで、実際に処理は行わない。
呼び出しが行われたかどうか、どんな引数で呼び出されたかなどを記録してくれるもの。
自分の中では、テストで扱う疑似の環境を用意してくれるものと思っています。
そしてmotoとは
AWS ServiceをMockしてくれる素晴らしいものです。
AWSサービスを実際に動かすことなく、疑似環境でテストが行えることができます。
環境
作業するのに必要な環境を整えます。
以下のサイトがわかりやすかったので、そちらを手順にしてみて下さい。
- pythonのダウンロード → こちらを参考
- vs codeのダウンロード → こちらを参考 (開発環境は何でもいいと思います)
- AWS CLIのダウンロード → windowsはこちら、macはこちら
#仮想環境構築
こちらも以下を参考にディレクトリに仮想環境を作ってください。
作成するとディレクトリ構成が以下のように
├── project_dir
│ ├── [newenvname]
venvをActivateさせると
(venvname)$
こんな形になると思います。
そしたらこの状態で次の作業を実行してみて下さい。
仮想環境にboto3とmotoを入れる
boto3
(venvname)$ pip install boto3
moto
(venvname)$ pip install moto
仮想環境にboto3
とmoto
のパッケージをインストールしました。
試しにActivateとDeactivateの両方でpip list
と入力してみて下さい。
Activateの時にしかboto3
とmoto
のパッケージが出力されないと思います。
そうなっていれば仮想環境の完成!!
必要ファイルの作成
下記のようなディレクトリ構成になるよう、app
,tests
ディレクトリを作成して下さい。
├── project_dir
│ ├── [newenvname]
│ ├── app
│ ├── tests
app
配下にapp.py
ファイルと__init__.py
を作成します。
tests
配下にtest.py
ファイルと__init__.py
を作成します。
全体の構成が以下のようになると思います。
├── project_dir
│ ├── [newenvname]
│ ├── app
│ ├── __init__.py
│ └── app.py
│ ├── tests
├── __init__.py
└── test.py
mockするプログラミング作成
EC2を起動させて、そのインスタンスIDを取得するコードになります。
test.py
で@mock_ec2
は忘れずに記述してください。
これがないと実際のAWS上に操作してしまうことになります。
import boto3
def describe():
ec2 = boto3.client('ec2')
# インスタンスIDを取得
instances = ec2.describe_instances()
instance_id = [instance['InstanceId'] for r in instances.get('Reservations') for instance in r.get('Instances')]
print(instance_id)
import unittest
import boto3
from moto import mock_ec2
from app import app
class MyTestCase(unittest.TestCase):
@mock_ec2
def test_start_instance(self):
ec2 = boto3.client('ec2')
# EC2を作成
ec2.run_instances(
ImageId='xxxxx',
MinCount=1,
MaxCount=1,
KeyName="ec2-1",
TagSpecifications=[{'ResourceType': 'instance',
'Tags': [{'Key': 'Name', 'Value': 'ec2-1'}]}])
# appファイルを実行
app.describe()
if __name__ == '__main__':
unittest.main()
boto3、motoの詳細は以下を参考ください
- moto
https://github.com/spulec/moto
https://github.com/spulec/moto/blob/master/IMPLEMENTATION_COVERAGE.md
- boto3
テスト実行
下記コマンドで実行します。
実行する際はapp
,tests
ディレクトリの両方が見える位置に注意!
(venvname)$ python -m unittest tests.test
これでローカルの仮想環境内でEC2を起動させ、そのインスタンスIDを取得できます。
AWSのコンソール画面で操作することなくAWSサービスをテストできるなんて本当にすごいですね。