Help us understand the problem. What is going on with this article?

motoを初めて使うまでの道のり

はじめに

こんばんwifi

motoを使用してAWSサービスをmockする手順を
自分用の備忘録として
初心者用に書き記したいと思います。

今回はEC2をローカル上で作成し、
そのインスタンスIDを取得するというテストを実施していこうと思います。

まずmockって何?

"モックオブジェクト"という言葉は、テストのために本物のオブジェクトをまねる特殊なオブジェクトを表す言葉らしいです。

テストやコンパイル用に用意されたダミーのクラスで、実際に処理は行わない。
呼び出しが行われたかどうか、どんな引数で呼び出されたかなどを記録してくれるもの。

自分の中では、テストで扱う疑似の環境を用意してくれるものと思っています。

そしてmotoとは

AWS ServiceをMockしてくれる素晴らしいものです。
AWSサービスを実際に動かすことなく、疑似環境でテストが行えることができます。

環境

作業するのに必要な環境を整えます。
以下のサイトがわかりやすかったので、そちらを手順にしてみて下さい。

  • pythonのダウンロード → こちらを参考
  • vs codeのダウンロード → こちらを参考 (開発環境は何でもいいと思います)
  • AWS CLIのダウンロード → windowsはこちら、macはこちら

仮想環境構築

こちらも以下を参考にディレクトリに仮想環境を作ってください。

venv: Python 仮想環境管理

作成するとディレクトリ構成が以下のように

├── project_dir
│   ├── [newenvname]

venvをActivateさせると

(venvname)$

こんな形になると思います。
そしたらこの状態で次の作業を実行してみて下さい。

仮想環境にboto3とmotoを入れる

boto3

(venvname)$ pip install boto3

moto

(venvname)$ pip install moto

仮想環境にboto3motoのパッケージをインストールしました。
試しにActivateとDeactivateの両方でpip listと入力してみて下さい。
Activateの時にしかboto3motoのパッケージが出力されないと思います。
そうなっていれば仮想環境の完成!!

必要ファイルの作成

下記のようなディレクトリ構成になるよう、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上に操作してしまうことになります。

app.py
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)
test.py
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

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.run_instances

テスト実行

下記コマンドで実行します。
実行する際はapp,testsディレクトリの両方が見える位置に注意!

(venvname)$ python -m unittest tests.test_sample

これでローカルの仮想環境内でEC2を起動させ、そのインスタンスIDを取得できます。
AWSのコンソール画面で操作することなくAWSサービスをテストできるなんて本当にすごいですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away