コードで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をインストールします。
$ 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をさわってみる
お題
- VPCを作成する
- Internet Gatewayを作成する
- 手順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)がお送りしました。