1. 必要な関数のimport

まずはじめに、必要な関数をimportします。私の環境ではスイッチロールしたアカウントで操作する必要があったため下記リンクを参考に設定しました。

スイッチロールしたIAM RoleをPython Boto3で使いたい

from boto3.session import Session
session = Session(profile_name= *****)
client = session.client("ec2")

2. VPCとサブネットを作成する

10.0.0.0/16のCIDRブロックをを持つVPCを作成します。作成後にVPCのidを取得します。

# VPCの作成
vpc = client.create_vpc(CidrBlock='10.0.0.0/16',)
vpc_id = vpc['Vpc']['VpcId']

作成したVPCに、10.0.0.0/24のCIDR ブロックを持つサブネットを作成します。

# subnetの作成
subnet = client.create_subnet(
    AvailabilityZone='ap-northeast-1a',
    CidrBlock='10.0.0.0/24',
    VpcId=vpc_id)
subnet_id = subnet['Subnet']['SubnetId']

3. サブネットをパブリックにする

作成したサブネットをパブリックサブネットにするには、インターネットゲートウェイ(igw)を作成しVPCにアタッチします。そして、カスタムルートテーブルを作成し、igwへのサブネットのルーティングを構成する必要があります。

まずigwを作成を行いigwのidを取得します。そして、作成したVPCにigwをアタッチします。

#igwの作成とigwのidを取得
internet_gateway = client.create_internet_gateway()
igw_id = internet_gateway['InternetGateway']['InternetGatewayId']

#igwをVPCにアタッチする
attach_igw_to_vpc = client.attach_internet_gateway(InternetGatewayId=igw_id, VpcId=vpc_id)

次に、カスタムルートテーブルを作成します。

#カスタムルートテーブルを作成しidを取得する
route_table = client.create_route_table(VpcId=vpc_id)
route_table_id = route_table['RouteTable']['RouteTableId']

igwへのすべてのトラフィック (0.0.0.0/0) をポイントするルートテーブルでルートを作成します。

#ルートを作成
create_route = client.create_route(
    DestinationCidrBlock='0.0.0.0/0',
    GatewayId=igw_id, 
    RouteTableId=route_table_id)

ルートテーブルはサブネットには関連付けられていませんので関連づけます。関連づけたidを取得します。

associate_route_table = client.associate_route_table(
    RouteTableId=route_table_id,
    SubnetId=subnet_id)
rt_associationId = associate_route_table['AssociationId']

サブネット内で起動されたインスタンスがパブリックIPアドレスを自動的に受信できるように設定します。

modify_subnet_attribute = client.modify_subnet_attribute(
    MapPublicIpOnLaunch={'Value': True},
    SubnetId=subnet_id)

4. サブネット内にインスタンスを起動する

パブリックサブネットまで作成できました。EC2を作成しssh接続するにセキュリティグループ(sg)とキーペアが必要ですので作成します。

sgを新しく作成しidを取得します。そして、ssh接続のための22ポートの接続を設定します。

#セキュリティグループを作成する
security_group = client.create_security_group(
    Description='test-from-boto3',
    GroupName='test-from-boto3',
    VpcId=vpc_id)
security_id = security_group['GroupId']

my_ip = '*.*.*.*/**'
#my_ipからの22番ポートへの接続を設定する
authorize_ssh = client.authorize_security_group_ingress(
    GroupId=security_id,
    IpPermissions=[
        {
            'FromPort': 22,
            'IpProtocol': 'tcp',
            'IpRanges': [
                {
                    'CidrIp': my_ip,
                    'Description': 'SSH access from the cm office',
                },
            ],
            'ToPort': 22,
        },
    ],
)

#python

boto3を使用してEC2立ち上げに必要な環境構築を行う
1.45 GEEK