コードでAWSをさわってみよう!プログラミング初心者向けAWS SDK(Boto3)の使い方

AWSを愛する皆さま、こんにちは。
FF14 Patch5.1『白き誓約、黒き密約』が楽しみなコンサルティング部の西野(@xiye_gen)です。

目次

はじめに:プログラミングに入門してはみたものの

「結局何ができるの?」
と思っている方は結構いらっしゃるんじゃないでしょうか。数年前までの私がまさにそうでした。

コンピュータサイエンスに関する知識をほぼ持たないまま前職の会社に入社しインフラSEとなった私は、興味(と若干の焦燥感)に駆られPythonの入門書などを読んでいました。しかし、入社後しばらくたっても業務におけるプログラミングといえば小さなシェルスクリプトを書く程度だったため、結局何が美味しいのかわからずじまいでした。

本エントリについて

数年前の私と同じような悩みを抱える皆さまにプログラミングの用途の一つをお伝えすることが本エントリの目的です。公式ドキュメントを読みつつ、Python3+AWS SDK for Python(Boto3)を使用しAWSリソースを操作してみましょう。
3連休のおともにしていただけたら嬉しいです。

主な対象者

  • AWS初心者の方
  • プログラミングの入門テキストを読みつつサンプルコードの写経ぐらいはしてみた方
  • プログラミングで何ができるか思いつかない方

目標

  • AWS SDKのドキュメントを読んでみる
  • AWS SDKを使ってAWSリソースを操作してみる

書かないこと(書けないこと)

  • AWS SDK使用時のベストプラクティス
  • Python3によるコーディングのベストプラクティス

事前準備

前提条件

本エントリに記載されたコマンドやプログラムは下記の環境で実行しております。

項目 内容
OS macOS Mojave 10.14.6
Python 3.7.4
AWS CLI 1.16.235
IAMユーザー AdministratorAccess(AWS管理ポリシー)をアタッチ済み
デフォルトリージョン ap-northeast-1

Pythonのインストール

環境構築ガイドを参考にインストールしてください。

Boto3のインストール

Boto3はAWS SDK for Pythonの別称であり、Pythonを介してAWSを操作するためのライブラリです。 公式ドキュメント記載のとおり、下記コマンドを実行しBoto3をインストールします。

Boto 3 Docs / Installation

$ pip install boto3

importできればインストール完了です。

$ python
Python 3.7.4 (default, Sep 10 2019, 14:34:03)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>>             # エラーが出なければimportできている

認証情報の設定

設定方法

AWS CLIをインストールした後にaws configureコマンドを実行して設定する手順がおすすめです。

AWS CLI のインストール
AWS CLI のかんたん設定aws configureコマンドの使用方法)

設定内容の確認

aws configureコマンドを実行すると下記の情報を含んだファイルが作成されます。

  • アクセスキーおよびシークレットアクセスキー(~/.aws/credentials
  • デフォルトリージョンのリージョン(~/.aws/config
$ cat ~/.aws/credentials
[default]
aws_access_key_id = AKXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json

AWS SDKでAWSをさわってみる

お題

  1. VPCを作成する
  2. Internet Gatewayを作成する
  3. 手順1で作成したVPCに手順2のInternet Gatewayをアタッチする

この流れで上図の環境を作成してみましょう。

VPCを作成する

まずはVPCを作成します。
コードの中身については後述いたしますので、まずは流れをご覧ください。

任意のディレクトリに下記のファイル(create_vpc.py)を作成します。

import boto3

client = boto3.client('ec2')
response = client.create_vpc(
    CidrBlock='10.0.0.0/16',
)

print(response)

実行してみます。辞書形式の情報が表示されます。

$ python create_vpc.py
{'Vpc': {'CidrBlock': '10.0.0.0/16', 'DhcpOptionsId': 'dopt-a0144cc7', 'State': 'pending', 'VpcId': 'vpc-048ec069f795618f5', 'OwnerId': 'XXXXXXXXXXXX`', 'InstanceTenancy': 'default', 'Ipv6CidrBlockAssociationSet': [], 'CidrBlockAssociationSet': [{'AssociationId': 'vpc-cidr-assoc-051a032XXXXXXXXXX', 'CidrBlock': '10.0.0.0/16', 'CidrBlockState': {'State': 'associated'}}], 'IsDefault': False, 'Tags': []}, 'ResponseMetadata': {'RequestId': '3315b887-XXXX-XXXX-b5ac-b4ceb0350a95', 'HTTPStatusCode': 200, 'HTTPHeaders': {'content-type': 'text/xml;charset=UTF-8', 'content-length': '923', 'date': 'Thu, 19 Sep 2019 06:43:33 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}}

Manegement ConsoleからVPCのダッシュボードに行き、VPCが作成されていることを確認します。

create_vpc.py解説

先ほどのコードで何をしていたのか説明します。

Boto3のインポート

import boto3

client = boto3.client('ec2')
response = client.create_vpc(
    CidrBlock='10.0.0.0/16',
)

print(response)

PythonからBoto3を使用するためにインポートします。

Clientインスタンスの生成

import boto3

client = boto3.client('ec2')
response = client.create_vpc(
    CidrBlock='10.0.0.0/16',
)

print(response)

AWSサービスに対応するClientクラスのインスタンスオブジェクトを生成します。このインスタンスオブジェクトから使用できるメソッドがAWSに対する操作の一つひとつに対応しています。Boto3からAWSを操作するためには、まずこのインスタンスオブジェクトを生成する必要があります。

VPCを作成するcreate_vpc()はclass EC2.Clientのメソッドである *1ため、当該クラスを使用します。
Clientインスタンスを生成する際の記法については下記ドキュメントをご参照ください。


Boto 3 Docs / Available Services / EC2 / Client

別サービスのClientを生成する記法は左ペインのAvailable Services -> 対象サービス名 -> Clientから確認できます。
(ほとんどの場合'ec2'の部分が'サービス名'に変化しているだけです。)

VPCの作成とレスポンスの取得

import boto3

client = boto3.client('ec2')
response = client.create_vpc(
    CidrBlock='10.0.0.0/16',
)

print(response)

create_vpc()のRequest SyntaxとParametersは下記のとおりです。

Boto 3 Docs / Available Services / EC2 / Client / create_vpc()

4つのParameterのうちCidrBlockのみが必須([REQUIRED])なので、今回はこれのみ指定しています。

Internet Gatewayを作成する

ここからは実際にドキュメントを探して・見つけて・読む方法を記します。

Internet Gatewayを作成するためのメソッドを調べましょう。
Boto 3 Docsのトップページに検索欄があります。

それっぽいのが出てきましたね。Internet GatewayもEC2のClientインスタンスを生成してあげれば良さそうです。クリックしてメソッドの説明を読んでみます。

Creates an internet gateway for use with a VPC. After creating the internet gateway, you attach it to a VPC using AttachInternetGateway .

これで問題なさそうなので、VPCの場合と同じようにRequest SyntaxとParametersを確認したあとコードを書きます。

import boto3

client = boto3.client('ec2')
response = client.create_internet_gateway(
)

print(response)

必須Parameterがないのでこのようになります。
実行してみます。

$ python create_internet_gateway.py
{'InternetGateway': {'Attachments': [], 'InternetGatewayId': 'igw-0cdbf23b93949cd1a', 'Tags': []}, 'ResponseMetadata': {'RequestId': '8eXXXXXX-XXXXX-XXXX-a7d9-76cc28e68a3f', 'HTTPStatusCode': 200, 'HTTPHeaders': {'content-type': 'text/xml;charset=UTF-8', 'content-length': '397', 'date': 'Thu, 19 Sep 2019 09:41:48 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}}

無事Internet Gatewayが作成されていますね。

VPCにInternet Gatewayをアタッチする

再びBoto 3 Docsを検索してみます。

それっぽいのを見つけました。説明を読んでみましょう。

Attaches an internet gateway to a VPC, enabling connectivity between the internet and the VPC.

大丈夫そうですね。Request SyntaxとParametersを確認しましょう。

InternetGatewayIdとVpcIdが必須のようです。
VPCとInternet GatewayのIDは作成時に出力されているので、それと同じものを書きます。

import boto3

client = boto3.client('ec2')
response = client.attach_internet_gateway(
    InternetGatewayId='igw-0cdbf23b93949cd1a',
    VpcId='vpc-048ec069f795618f5'
)

print(response)

実行してみます。

$ python attach_internet_gateway.py
{'ResponseMetadata': {'RequestId': '8262XXX-XXXX-XXXX-a266-bbc8fc137dc7', 'HTTPStatusCode': 200, 'HTTPHeaders': {'content-type': 'text/xml;charset=UTF-8', 'content-length': '243', 'date': 'Thu, 19 Sep 2019 10:04:32 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}}

無事アタッチされました。

全部いっぺんにやる

もちろん上述の3ステップを一つのファイルで実行することもできます。

import boto3

client = boto3.client('ec2')

response_create_vpc = client.create_vpc(
    CidrBlock='10.111.0.0/16',
)
vpc_id = response_create_vpc['Vpc']['VpcId']

response_create_igw = client.create_internet_gateway(
)
igw_id = response_create_igw['InternetGateway']['InternetGatewayId']

response_attach_igw = client.attach_internet_gateway(
    InternetGatewayId=igw_id,
    VpcId=vpc_id
)

コードでAWSをさわることの利点

JAWS-UG CLI専門支部を運営なさっている波田野裕一さんの資料がとても参考になります。
AWSサービスの操作は専用エンドポイントへのAPIコールによって行われるものであり、一連のAPIコールをGUI上から実施するための仕組みがAWS Management Consoleです。AWS SDK(あるいはAWS CLI)を使用すると、より抽象度を下げた状態でAWSの動きを理解することができます。

資料内では主にGUIとCLIとの比較がなされていますが、CLIのメリットの多くはAWS SDKの場合にも妥当すると思います。

終わりに

AWS SDKの使用方法を会得することによって、自分用のちょっとしたツールを書いたりAWS Lambdaでサービス連携をさせたりと、AWSを使ってできることの幅が広がります。 *2

このブログがほんの少しでも世界を良くできれば嬉しいです。
コンサルティング部の西野(@xiye_gen)がお送りしました。

脚注

  1. Boto 3 Docs内で「create vpc」などと検索するとどのClientを生成すれば良いのかわかります。
  2. 今回のVPC環境のようなものの構築にはCloudFormationなどを利用したほうが良いです。あくまでサンプルということでご理解ください。