20191230のAWSに関する記事は20件です。

YAMAHAルーター経由でOracle CloudとAWSをIPSec VPNで接続してみてみた

■目的

YAMAHAルーターとOCI接続を数多くやってきましたが、YAMAHAルーター経由したOCIとAWSのIPSec複数拠点接続設定の問い合わせもよくくる、、
ということで、今回はGIUかんたん接続でYAMAHAルーターとAWS接続をやってみてみます。

■構成図

構成図.png

YAMAHAルーターは、イプシムのSIMを入れたNVR700wを使用します。
AWS側は、事前にVPC,EC2インスタンスを作成しておきます。今回は、仮想プライベートゲートウェイの作成から行います。
OCI側は、事前に以前の記事を参考に接続設定をします

■AWSとYAMAHAルータ IPSec接続設定

●仮想プライベートゲートウェイの作成

① 仮想プライベートゲートウェイ画面

VPCダッシュボードから、「仮想プライベートゲートウェイ」を選択し、[仮想プライベートゲートウェイの作成]をクリック
01.png

② 仮想プライベートゲートウェイの作成画面1

以下項目を設定し[仮想プライベートゲートウェイの作成]をクリック

・名前タグ:任意の名前を設定
・ASN: AmazonのデフォルトASNを選択

02.png

③仮想プライベートゲートウェイの作成画面2

「作成画仮想プライベートゲートウェイの作成しました。」
が表示されたら、[閉じる]をクリック
03.png

●VPN接続の作成

① サイト間のVPN接続画面

VPCダッシュボードから、「サイト間のVPN接続」を選択し、[VPN接続の作成]をクリック
10.png

②VPN接続の作成画面1

以下項目を設定し[VPN接続の作成]をクリック

・名前タグ: 任意の名前を設定
・Target Gatway type: ここではVirtual Private Gatwayを選択
・仮想プライベートゲートウェイ: 作成した仮想プライベートゲートウェイを選択
・カスタマーゲートウェイ: 新規を選択
・BGP ASN: 任意のPriavate ASNを設定
・ルーティングオプション: ここでは動的BGPを選択

11.png

③VPN接続の作成画面2

「VPN接続の作成リクエストが成功しました」が表示されたことを確認し[閉じる]をクリック
12.png

④ サイト間のVPN接続画面

作成したBPN接続が表示され、状態が「保留中」であることを確認
13.png

■Amazon VPCとVPN(IPsec)接続Web GUI設定

●AWS アクセスキー発行

YAMAHAルーターとAWSをGUIでIPSec接続できるように
接続設定用AWSユーザーを作成し、AWS IAMアクセスキー ID とシークレットアクセスキーを作成します

①AWS Webコンソールから、「IAM」> [ユーザー]画面から[ユーザーを追加]をクリック

01.png

②ユーザー設定画面

以下項目を入力し[次のステップ:アクセス制限]をクリック

・ユーザー名: 任意の名前を入力
・プログラムによるアクセス: チェックする

02.png

③ユーザーを追加画面

[ユーザーをクループに追加]を選択し、[グループの作成]をクリック

03.png

④グループの作成画面

以下設定をし、[グループの作成]をクリック

・グループ名: 任意の名前を入力
・ポリシー名: [AmazonVPCReadOnlyAccess]を選択

04_1.png

⑤ユーザーを追加画面

作成した「グループ」と「アタッチされたポリシー」を確認して、[次のステップ:確認]をクリック
05.png

⑥ユーザーを追加画面(タグの追加)

タグの追加は必要に応じて設定し、[次のステップ:確認]をクリック
06.png

⑦ ユーザーを追加画面(確認)

表示された内容を確認し、[ユーザーの作成]をクリックします。
07.png

⑧ユーザーを追加画面(成功)

[.csv のダウンロード]をクリックしてダウンロード
accessKeys.csvファイルがダウンロードされます
08.png

⑨accessKeys.csvファイル確認

accessKeys.csvファイルにAccess key ID,Secret access keyが記載されていることを確認
この情報を使用してYAMAHAルーターのGUI画面でかんたん接続します。

[root@mac ~]# cat accessKeys.csv
    Access key ID,Secret access key
    AKIAQE,g4c6PWoL0cJWrAvck4foz

■YAHAMAルーターGUI設定

ここからは、YAMAHAルーターのWebUIへ接続しGUIでAWSへ接続します。

① かんたん設定画面

YAMAH Webコンソールに接続し、[かんたん設定]タブから、[VPN] > [クラウド接続]を選択し、「新規作成」の[新規]をクリック
01.png

②サービス種別の選択画面

[次へ]をクリック
02.png

③接続設定画面

以下設定を行い[次へ]をクリック

・設定名: 任意の名前を設定
・アクセスキーID: ダウンロードしたcsvの「Access key ID」を設定
・シークレットアクセスキー: ダウンロードしたcsvの「Secret access key」を設定
・VPN ID: 作成したVPN接続のIDを設定
・リージョン: VPCのリージョンを設定
・AWSからの設定取得: [取得する]を選択

03.png

④入力内容を確認画面

入力内容を確認し[次へ]をクリック
04.png

⑤内容の確認と取得画面1

進捗状況がすべてチェックされグリーンになり問題ないことを確認し、[OK]をクリック
05.png

⑥内容の確認と取得画面2

AWSと接続できたことを確認し設定完了
06.png

●NVR700wコンフィグ確認

かんたん設定で設定されたルーターのconfigを確認します

# show config
    # NVR700W Rev.15.00.16 (Thu Jun 20 19:48:42 2019)
    # MAC Address : 00:a0:de:b2:31, 00:a0:de:b2:32
    # Memory 256Mbytes, 2LAN, 1ONU, 1WWAN
    # main:  NVR700W ver=00 serial=M401111 MAC-Address=00:a0:de:b2:31 MAC-Address=00:a0:de:b2:32
    # Reporting Date: Dec 16 00:00:34 2019
    administrator password encrypted *
    http login-timer=600 multi-session=on
    console character en.ascii
    ip route default gateway pdp wan1
    ip lan1 address 192.168.100.1/24
    ip wan1 address pdp
    ip wan1 nat descriptor 31000
    wan1 bind wwan 1
    wwan select 1
    description wwan IPSIM
    wwan always-on on
    wwan auth accept chap
    wwan auth myname sim@with sim
    wwan auto connect on
    wwan disconnect time off
    wwan disconnect input time off
    wwan disconnect output time off
    wwan access-point name 4gn.jp
    wwan access limit length off
    wwan access limit time off
    wwan enable 1
    tunnel select 1
    description tunnel AWS-IPSec_amazon-api_20191216000256
    ipsec tunnel 1
    ipsec sa policy 1 1 esp aes-cbc sha-hmac
    ipsec ike duration ipsec-sa 1 3600
    ipsec ike encryption 1 aes-cbc
    ipsec ike group 1 modp1024
    ipsec ike hash 1 sha
    ipsec ike keepalive use 1 on dpd 10 3
    ipsec ike local address 1 192.168.100.1
    ipsec ike nat-traversal 1 on type=2
    ipsec ike pfs 1 on
    ipsec ike pre-shared-key 1 text IPSecKey01
    ipsec ike remote address 1 110.110.110.111
    ipsec tunnel outer df-bit clear
    ip tunnel address 169.254.128.14/30
    ip tunnel remote address 169.254.128.13
    ip tunnel tcp mss limit 1379
    tunnel enable 1
    tunnel select 2
    description tunnel AWS-IPSec_amazon-api_20191216000256
    ipsec tunnel 2
    ipsec sa policy 2 2 esp aes-cbc sha-hmac
    ipsec ike duration ipsec-sa 2 3600
    ipsec ike encryption 2 aes-cbc
    ipsec ike group 2 modp1024
    ipsec ike hash 2 sha
    ipsec ike keepalive use 2 on dpd 10 3
    ipsec ike local address 2 192.168.100.1
    ipsec ike nat-traversal 2 on type=2
    ipsec ike pfs 2 on
    ipsec ike pre-shared-key 2 text IPSecKey02
    ipsec ike remote address 1 110.110.110.112
    ipsec tunnel outer df-bit clear
    ip tunnel address 169.254.246.154/30
    ip tunnel remote address 169.254.246.153
    ip tunnel tcp mss limit 1379
    tunnel enable 2
    nat descriptor type 31000 masquerade
    nat descriptor address outer 31000 primary
    nat descriptor masquerade static 31000 1 192.168.100.1 udp 500
    nat descriptor masquerade static 31000 2 192.168.100.1 esp
    nat descriptor masquerade static 31000 3 192.168.100.1 udp 4500
    bgp use on
    bgp autonomous-system 65000
    bgp neighbor 1 64512 169.254.128.13 hold-time=30 local-address=169.254.128.14
    bgp neighbor 2 64512 169.254.246.153 hold-time=30 local-address=169.254.246.154
    bgp router id 169.254.128.14
    bgp import filter 1 equal 0.0.0.0/0
    bgp import 64512 static filter 1
    ipsec auto refresh on
    telnetd service off
    dhcp service server
    dhcp server rfc2131 compliant except remain-silent
    dhcp scope 1 192.168.100.2-192.168.100.191/24
    dns host lan1
    dns server pdp wan1
    dns server select 500401 pdp wan1 any .
    dns private address spoof on
    dns private name setup.netvolante.jp
    analog supplementary-service pseudo call-waiting
    analog extension dial prefix sip prefix="9#"
    cloud vpn service 1 amazon-api
    cloud vpn parameter 1 AKIAQE2ZRNJBCRXNSTEH g4c6PWoL0cJWrA
    2SSG vpn-0753df86d096937e6
    cloud vpn option 1 region=ap-northeast-1
    cloud vpn name 1 AWS-IPSec
    cloud vpn bind 1 tunnel1 tunnel2
    sshd service on
    sshd host key generate *
    statistics traffic on
    wwan-module use on

●設定確認

・IPsec SA確認

IPsec SAが確立されていることを確認

# show ipsec sa
    Total: isakmp:2 send:2 recv:2

    sa    sgw isakmp connection    dir  life[s] remote-id
    ----------------------------------------------------------------------------
    1     1    -     isakmp        -    28340   52.197.18.189
    2     2    -     isakmp        -    28340   54.95.75.6
    3     2    2     tun[0002]esp  send 3142    54.95.75.6
    4     2    2     tun[0002]esp  recv 3142    54.95.75.6
    5     1    1     tun[0001]esp  send 3142    52.197.18.189
    6     1    1     tun[0001]esp  recv 3142    52.197.18.189

・bgp neighbor確認

AWSとBGPが確立されていることを確認

# show status bgp neighbor
    BGP neighbor is 169.254.128.13, remote AS 64512, local AS 65000, external link
    BGP version 4, remote router ID 169.254.128.13
    BGP state = Established, up for 00:09:29
    Last read 00:00:09, hold time is 30, keepalive interval is 10 seconds
    Received 59 messages, 0 notifications, 0 in queue
    Sent 61 messages, 0 notifications, 0 in queue
    Connection established 1; dropped 0
    Last reset never
    Local host: 169.254.128.14, Local port: 179
    Foreign host: 169.254.128.13, Foreign port: 44037

    BGP neighbor is 169.254.246.153, remote AS 64512, local AS 65000, external link
    BGP version 4, remote router ID 169.254.246.153
    BGP state = Established, up for 00:09:33
    Last read 00:00:03, hold time is 30, keepalive interval is 10 seconds
    Received 61 messages, 0 notifications, 0 in queue
    Sent 62 messages, 0 notifications, 0 in queue
    Connection established 1; dropped 0
    Last reset never
    Local host: 169.254.246.154, Local port: 179
    Foreign host: 169.254.246.153, Foreign port: 41953

・IP Route確認

IPSec Tunnel IPのRouteとAWSのCIDR情報が伝搬されていることを確認

# show ip route
    Destination         Gateway          Interface       Kind  Additional Info.
    default             210.156.170.177   WAN1(PDP)    static
    118.238.201.33/32   210.156.170.177        WAN1 temporary
    169.254.128.12/30   -                 TUNNEL[1]  implicit
    169.254.246.152/30  -                 TUNNEL[2]  implicit
    172.24.0.0/16       169.254.128.13    TUNNEL[1]       BGP  path=64512
    192.168.100.0/24    192.168.100.1          LAN1  implicit
    210.0.0.0/8         200.200.200.201        WAN1  implicit

● AWSサイト間のVPN接続画面

AWSのサイト間のVPN接続画面のVPN接続の状態が「使用可能」となり、
Tunnel Detailの各Tunnelのステータスが「アップ」であることを確認
01.png

■OCIとYAMAHAルータ IPSec接続設定

OCIとYAMAHAルータのIPSec接続は以前の記事を参考に設定します。
Oracle Cloud:YAMAHA NVR700wでOCIへIPsec VPN接続してみてみた
ここでは、YAMAHAルータの設定を記載します

●IPSec接続設定

OCIに接続するtunnelナンバーを11と12で設定

tunnel select 11
    description tunnel OCI-VPN1
    ipsec tunnel 11
    ipsec sa policy 11 11 esp aes256-cbc sha-hmac
    ipsec ike duration ipsec-sa 11 3600
    ipsec ike duration isakmp-sa 11 28800
    ipsec ike encryption 11 aes256-cbc
    ipsec ike group 11 modp1536
    ipsec ike hash 11 sha256
    ipsec ike keepalive log 11 off
    ipsec ike keepalive use 11 on dpd 5 4
    ipsec ike local address 11 200.200.200.201
    ipsec ike local id 11 0.0.0.0/0
    ipsec ike nat-traversal 11 on
    ipsec ike pfs 11 on
    ipsec ike pre-shared-key 11 text IPSecKey11
    ipsec ike remote address 11 100.100.100.101
    ipsec ike remote id 11 0.0.0.0/0
    ip tunnel tcp mss limit auto
    tunnel enable 11

tunnel select 12
    description tunnel OCI-VPN2
    ipsec tunnel 12
    ipsec sa policy 12 12 esp aes256-cbc sha-hmac
    ipsec ike duration ipsec-sa 12 3600
    ipsec ike duration isakmp-sa 12 28800
    ipsec ike encryption 12 aes256-cbc
    ipsec ike group 12 modp1536
    ipsec ike hash 12 sha256
    ipsec ike keepalive log 12 off
    ipsec ike keepalive use 12 on dpd 5 4
    ipsec ike local address 12 200.200.200.201
    ipsec ike local id 12 0.0.0.0/0
    ipsec ike nat-traversal 12 on
    ipsec ike pfs 12 on
    ipsec ike pre-shared-key 12 text IPSecKey12
    ipsec ike remote address 12 100.100.100.102
    ipsec ike remote id 12 0.0.0.0/0
    ip tunnel tcp mss limit auto
    tunnel enable 12

●IPSec設定反映

# ipsec auto refresh on

●BGP接続設定

tunnel select 11
 ip tunnel address 192.168.0.101/30
 ip tunnel remote address 192.168.0.102

tunnel select 12
 ip tunnel address 192.168.0.105/30
 ip tunnel remote address 192.168.0.106

bgp use on
 bgp autonomous-system 65000
 bgp log neighbor
 bgp neighbor 11 31898 192.168.0.102 hold-time=180 local-address=192.168.0.101
 bgp neighbor 12 31898 192.168.0.106 hold-time=180 local-address=192.168.0.105
 bgp import filter 1 equal 0.0.0.0/0
 bgp import 31898 static filter 1

●BGP設定反映

# bgp configure refresh
# show ipsec sa
    Total: isakmp:5 send:4 recv:67

     sa    sgw isakmp connection    dir  life[s] remote-id
    ----------------------------------------------------------------------------
    1     12   -     isakmp        -    28773   140.204.10.62
    2     12   1     tun[0012]esp  send 3575    140.204.10.62
    3     11   47    tun[0011]esp  send 1352    140.204.10.49
    4     1    78    tun[0001]esp  send 2295    52.194.161.178
    5     1    78    tun[0001]esp  recv 2295    52.194.161.178
    6     12   -     tun[0012]esp  recv 2955    140.204.10.62
    7     11   -     isakmp        -    4746    140.204.10.49
    8     1    -     isakmp        -    21296   52.194.161.178
    9     2    -     isakmp        -    21297   54.249.65.49
    10    11   47    tun[0011]esp  recv 1352    140.204.10.49
    11    2    79    tun[0002]esp  send 2296    54.249.65.49
    12    2    79    tun[0002]esp  recv 2296    54.249.65.49

●BGP接続確認

# show status bgp neighbor
    BGP neighbor is 169.254.151.189, remote AS 64512, local AS 65000, external link
    BGP version 4, remote router ID 0.0.0.0
    BGP state = Active
    Last read 00:00:00, hold time is 0, keepalive interval is 0 seconds
    Received 0 messages, 0 notifications, 0 in queue
    Sent 1 messages, 0 notifications, 0 in queue
    Connection established 0; dropped 0
    Last reset never
    Local host: unspecified
    Foreign host: 169.254.151.189, Foreign port: 0

    BGP neighbor is 169.254.21.85, remote AS 64512, local AS 65000, external link
    BGP version 0, remote router ID 0.0.0.0
    BGP state = Active
    Last read 00:00:00, hold time is 0, keepalive interval is 0 seconds
    Received 0 messages, 0 notifications, 0 in queue
    Sent 0 messages, 0 notifications, 0 in queue
    Connection established 0; dropped 0
    Last reset never
    Local host: unspecified
    Foreign host: 169.254.21.85, Foreign port: 0

    BGP neighbor is 192.168.0.102, remote AS 31898, local AS 65000, external link
    BGP version 0, remote router ID 0.0.0.0
    BGP state = Active
    Last read 00:00:00, hold time is 0, keepalive interval is 0 seconds
    Received 0 messages, 0 notifications, 0 in queue
    Sent 0 messages, 0 notifications, 0 in queue
    Connection established 0; dropped 0
    Last reset never
    Local host: unspecified
    Foreign host: 192.168.0.102, Foreign port: 0

    BGP neighbor is 192.168.0.106, remote AS 31898, local AS 65000, external link
    BGP version 0, remote router ID 0.0.0.0
    BGP state = Active
    Last read 00:00:00, hold time is 0, keepalive interval is 0 seconds
    Received 0 messages, 0 notifications, 0 in queue
    Sent 0 messages, 0 notifications, 0 in queue
    Connection established 0; dropped 0
    Last reset never
    Local host: unspecified
    Foreign host: 192.168.0.106, Foreign port: 0

●BGPルート伝搬確認

# show ip route
    Destination         Gateway          Interface       Kind  Additional Info.
    default             210.156.170.177   WAN1(PDP)    static
    10.0.0.0/24         192.168.0.102    TUNNEL[11]       BGP  path=31898
    118.238.201.33/32   210.156.170.177        WAN1 temporary
    169.254.21.84/30    -                 TUNNEL[2]  implicit
    169.254.151.188/30  -                 TUNNEL[1]  implicit
    172.25.0.0/16       169.254.151.189   TUNNEL[1]       BGP  path=64512
    192.168.0.100/30    -                TUNNEL[11]  implicit
    192.168.0.104/30    -                TUNNEL[12]  implicit
    192.168.100.0/24    192.168.100.1          LAN1  implicit
    210.0.0.0/8         200.200.200.201        WAN1  implicit

●ルーターコンフィグ確認

# show config
    # NVR700W Rev.15.00.16 (Thu Jun 20 19:48:42 2019)
    # MAC Address : 00:a0:de:b2:31, 00:a0:de:b2:32
    # Memory 256Mbytes, 2LAN, 1ONU, 1WWAN
    # main:  NVR700W ver=00 serial=M401111 MAC-Address=00:a0:de:b2:31 MAC-Address=00:a0:de:b2:32
    # Reporting Date: Dec 16 00:00:34 2019
    administrator password encrypted *
    http login-timer=600 multi-session=on
    console character en.ascii
    ip route default gateway pdp wan1
    ip lan1 address 192.168.100.1/24
    ip wan1 address pdp
    ip wan1 nat descriptor 31000
    wan1 bind wwan 1
    wwan select 1
    description wwan IPSIM
    wwan always-on on
    wwan auth accept chap
    wwan auth myname sim@with sim
    wwan auto connect on
    wwan disconnect time off
    wwan disconnect input time off
    wwan disconnect output time off
    wwan access-point name 4gn.jp
    wwan access limit length off
    wwan access limit time off
    wwan enable 1
    tunnel select 1
    description tunnel AWS-IPSec_amazon-api_20191224085716
    ipsec tunnel 1
    ipsec sa policy 1 1 esp aes-cbc sha-hmac
    ipsec ike duration ipsec-sa 1 3600
    ipsec ike encryption 1 aes-cbc
    ipsec ike group 1 modp1024
    ipsec ike hash 1 sha
    ipsec ike keepalive use 1 on dpd 10 3
    ipsec ike local address 1 192.168.100.1
    ipsec ike nat-traversal 1 on type=2
    ipsec ike pfs 1 on
    ipsec ike pre-shared-key 1 text IPSecKey01
    ipsec ike remote address 1 110.110.110.111
    ipsec tunnel outer df-bit clear
    ip tunnel address 169.254.151.190/30
    ip tunnel remote address 169.254.151.189
    ip tunnel tcp mss limit 1379
    tunnel enable 1
    tunnel select 2
    description tunnel AWS-IPSec_amazon-api_20191224085716
    ipsec tunnel 2
    ipsec sa policy 2 2 esp aes-cbc sha-hmac
    ipsec ike duration ipsec-sa 2 3600
    ipsec ike encryption 2 aes-cbc
    ipsec ike group 2 modp1024
    ipsec ike hash 2 sha
    ipsec ike keepalive use 2 on dpd 10 3
    ipsec ike local address 2 192.168.100.1
    ipsec ike nat-traversal 2 on type=2
    ipsec ike pfs 2 on
    ipsec ike pre-shared-key 2 text IPSecKey02
    ipsec ike remote address 2 110.110.110.112
    ipsec tunnel outer df-bit clear
    ip tunnel address 169.254.21.86/30
    ip tunnel remote address 169.254.21.85
    ip tunnel tcp mss limit 1379
    tunnel enable 2
    tunnel select 11
    description tunnel OCI-VPN1
    ipsec tunnel 11
    ipsec sa policy 11 11 esp aes256-cbc sha-hmac
    ipsec ike duration ipsec-sa 11 3600
    ipsec ike duration isakmp-sa 11 28800
    ipsec ike encryption 11 aes256-cbc
    ipsec ike group 11 modp1536
    ipsec ike hash 11 sha256
    ipsec ike keepalive log 11 off
    ipsec ike keepalive use 11 on dpd 5 4
    ipsec ike local address 11 200.200.200.201
    ipsec ike local id 11 0.0.0.0/0
    ipsec ike nat-traversal 11 on
    ipsec ike pfs 11 on
    ipsec ike pre-shared-key 11 text IPSecKey11
    ipsec ike remote address 11 100.100.100.101
    ipsec ike remote id 11 0.0.0.0/0
    ip tunnel address 192.168.0.101/30
    ip tunnel remote address 192.168.0.102
    ip tunnel tcp mss limit auto
    tunnel enable 11
    tunnel select 12
    description tunnel OCI-VPN2
    ipsec tunnel 12
    ipsec sa policy 12 12 esp aes256-cbc sha-hmac
    ipsec ike duration ipsec-sa 12 3600
    ipsec ike duration isakmp-sa 12 28800
    ipsec ike encryption 12 aes256-cbc
    ipsec ike group 12 modp1536
    ipsec ike hash 12 sha256
    ipsec ike keepalive log 12 off
    ipsec ike keepalive use 12 on dpd 5 4
    ipsec ike local address 12 200.200.200.201
    ipsec ike local id 12 0.0.0.0/0
    ipsec ike nat-traversal 12 on
    ipsec ike pfs 12 on
    ipsec ike pre-shared-key 12 text IPSecKey12
    ipsec ike remote address 12 100.100.100.102
    ipsec ike remote id 12 0.0.0.0/0
    ip tunnel address 192.168.0.105/30
    ip tunnel remote address 192.168.0.106
    ip tunnel tcp mss limit auto
    tunnel enable 12
    nat descriptor type 31000 masquerade
    nat descriptor address outer 31000 primary
    nat descriptor masquerade static 31000 1 192.168.100.1 udp 500
    nat descriptor masquerade static 31000 2 192.168.100.1 esp
    nat descriptor masquerade static 31000 3 192.168.100.1 udp 4500
    bgp use on
    bgp autonomous-system 65000
    bgp neighbor 1 64512 169.254.151.189 hold-time=30 local-address=169.254.151.190
    bgp neighbor 2 64512 169.254.21.85 hold-time=30 local-address=169.254.21.86
    bgp neighbor 11 31898 192.168.0.102 hold-time=180 local-address=192.168.0.101
    bgp neighbor 12 31898 192.168.0.106 hold-time=180 local-address=192.168.0.105
    bgp router id 169.254.128.14
    bgp import filter 1 equal 0.0.0.0/0
    bgp import 31898 static filter 1
    bgp import 64512 static filter 1
    ipsec auto refresh on
    telnetd service off
    dhcp service server
    dhcp server rfc2131 compliant except remain-silent
    dhcp scope 1 192.168.100.2-192.168.100.191/24
    dns host lan1
    dns server pdp wan1
    dns server select 500401 pdp wan1 any .
    dns private address spoof on
    dns private name setup.netvolante.jp
    analog supplementary-service pseudo call-waiting
    analog extension dial prefix sip prefix="9#"
    cloud vpn service 1 amazon-api
    cloud vpn parameter 1 AKIAQE2ZRNJBCRXNSTEH g4c6PWoL0cJWrA
    2SSG vpn-030ad75b05aea2e9d
    cloud vpn option 1 region=ap-northeast-1
    cloud vpn name 1 AWS-IPSec
    cloud vpn bind 1 tunnel1 tunnel2
    sshd service on
    sshd host key generate *
    statistics traffic on
    wwan-module use on

■接続疎通確認

● OIC -> AWSインスタンス疎通確認

・traceroute確認

[root@tokyo-inst01 opc]# traceroute 172.25.0.10
    traceroute to 172.25.0.10 (172.25.0.10), 30 hops max, 60 byte packets
    1  140.91.206.3 (140.91.206.3)  0.656 ms 140.91.206.5 (140.91.206.5)  0.610 ms  0.530 ms
    2  192.168.0.101 (192.168.0.101)  114.435 ms  105.154 ms  119.114 ms
    3  172.25.0.10 (172.25.0.10)  306.368 ms  337.274 ms  315.354 ms

・ping疎通確認

[root@tokyo-inst01 opc]# ping 172.25.0.10 -c 3
    PING 172.25.0.10 (172.25.0.10) 56(84) bytes of data.
    64 bytes from 172.25.0.10: icmp_seq=1 ttl=252 time=199 ms
    64 bytes from 172.25.0.10: icmp_seq=2 ttl=252 time=179 ms
    64 bytes from 172.25.0.10: icmp_seq=3 ttl=252 time=177 ms

    --- 172.25.0.10 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2001ms
    rtt min/avg/max/mdev = 177.914/185.675/199.977/10.131 ms

・ssh接続確認

[root@tokyo-inst01 opc]# ssh -i AWS_id_rsa ec2-user@172.25.0.10 hostname
    ip-172-25-0-10.ap-northeast-1.compute.internal

● AWS -> OCIインスタンス疎通確認

・traceroute確認

[root@ip-172-25-0-10 ec2-user]# traceroute 10.0.0.2
traceroute to 10.0.0.2 (10.0.0.2), 30 hops max, 60 byte packets
 1  169.254.151.190 (169.254.151.190)  135.655 ms  151.680 ms  140.557 ms
 2  140.204.10.49 (140.204.10.49)  224.682 ms  237.639 ms  243.538 ms
 3  ip-10-0-0-2.ap-northeast-1.compute.internal (10.0.0.2)  260.594 ms !X  267.558 ms !X  279.500 ms !X

・ping疎通確認

[root@ip-172-25-0-10 ec2-user]# ping 10.0.0.2 -c 3
    PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
    64 bytes from 10.0.0.2: icmp_seq=1 ttl=62 time=204 ms
    64 bytes from 10.0.0.2: icmp_seq=2 ttl=62 time=183 ms
    64 bytes from 10.0.0.2: icmp_seq=3 ttl=62 time=203 ms

    --- 10.0.0.2 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2000ms
    rtt min/avg/max/mdev = 183.944/197.340/204.138/9.472 ms

・ssh接続確認

[root@ip-172-25-0-10 ec2-user]# ssh -i id_rsa opc@10.0.0.2 hostname
    tokyo-inst01

■参考

YAMAHA: Amazon VPCとの接続
ORACLE: Yamaha RTX Series

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS codedeploy 流れ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SQSとSNSによるPub/SubをCloudFormationで構築

はじめに

クラウドコンピューティングやマイクロサービスなどが盛り上がる中、スケールアウトや並列化との相性の良さなどからシステム間の通信方式としてPub/Subモデルが注目されています。Pub/Subモデルの特徴などは様々な記事にて語られていますのでここでは省略します。

本記事では Amazon SNSAmazon SQS によりPub/Subモデルを実現する方法を紹介します。SQSのみでも実現可能ですがSNSを用いることでより柔軟なシステムを構築可能です。SNSを用いるメリットの詳細については以下の記事などをご参照ください。

【AWS】SQSキューの前には難しいこと考えずにSNSトピックを挟むと良いよ、という話

さらに今回はIaC (Infrastructure as Code) の考えやCI/CDの実現、再現性やカスタマイズ性などを考慮し、AWS CloudFormation を用いて必要なAWSリソースを定義します。

各サービスの特徴

Amazon SNS (Simple Notification System)

Amazon SNSはメッセージのPublishを行うサービスです。トピックのSubscriptionを定義することで、トピックへ発行されたメッセージを種々のサービスへ配信できます。配信先は2019年12月現在で

  • Amazon SQS
  • HTTP/S
  • Eメール
  • SMS
  • Lambda

が用意されています。メッセージの配信者はAPIなどによりトピックへメッセージを発行(Publish)するだけでよく、その配信先を意識する必要がありません。

Amazon SQS (Simple Queue Service)

Amazon SQSはメッセージのqueuingサービスです。キューへメッセージを送信することでメッセージが溜められ、メッセージを取得し削除するまでキューに残り続けます。また取得回数が一定数を超えたメッセージを デッドレターキュー に入れるなどの設定も可能です。

構築

今回は以下のようにしてシステムAがシステムBへ情報を届けることを想定します。
1. システムAがSNSトピックへPublish
2. SQSキューがSNSトピックをSubscribe
3. システムBがSQSキューのメッセージをGet

概要.png

以下ではシステムAとSNSトピックを合わせて Publisher(パブリッシャー)、システムBとSQSキューを合わせて Subscriber(サブスクライバー) と呼びます。

本記事ではPublisherとSubscriberは 同じAWSアカウント別のCloudFormationスタック に構築するとします。同じスタックで定義する場合はOutputsやImportValueなどが不要となります。別のAWSアカウント間で構築したい場合はまた設定が異なります(本記事の対象外です)。

Publisher側(SNSトピック)の構築

CloudFormationによりSNSトピックを作成します。またSubscriber側からSNSトピックのARNを参照するためにOutputsセクションを定義しています。今回は細かなパラメータは省略していますので、以下の公式ドキュメントを参考にカスタマイズしてください。

system_a.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: System A

Resources:
  Topic:
    Type: AWS::SNS::Topic

Outputs:
  TopicArn:
    Value: !Ref Topic
    Export:
      Name: SystemASnsTopicArn

このテンプレートをCloudFormationに入力することでSNSトピックの構築が完了します。

create_system_a.sh
aws cloudformation create-stack \
  --stack-name system-a-stack \
  --template-body file://system_a.yaml

Subscriber側(SQSキュー)の構築

CloudFormationによりSNSトピックをサブスクライブしてデータを格納するSQSキューとそのデッドレターキューを作成します。また今回はSQSキューへのアクセス権限(Queueポリシー)やSNSトピックへのサブスクリプションもこちらで定義しています。SNSトピックのARNをPublisher側で出力したものを参照するためImportValue関数を用いています。その他の細かい設定は以下を参照してください。

system_b.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: System B

Resources:
  Queue:
    Type: AWS::SQS::Queue

  SnsSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Protocol: sqs
      Endpoint: !GetAtt Queue.Arn
      TopicArn: !ImportValue SystemASnsTopicArn

  QueuePolycy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Id: AllowSnsTopicToSendMessage
        Statement:
          - Sid: 1
            Effect: Allow
            Principal: "*"
            Action:
              - sqs:SendMessage
            Resource: "*"
            Condition:
              ArnEquals:
                aws:SourceArn:
                  !ImportValue SystemASnsTopicArn
      Queues:
        - !Ref Queue

このテンプレートをCloudFormationに入力することでSQSキューの作成やSNSトピックへのサブスクリプションの構築が完了します。

create_system_b.sh
aws cloudformation create-stack \
  --stack-name system-b-stack \
  --template-body file://system_b.yaml

動作確認

以上でSNSトピックとSQSキューの連携が完了しました。AWSコンソールなどからSNSトピックへメッセージを発行することで、SQSキューへメッセージが溜まることが確認できるかと思います。

CLIからの確認であれば以下の形式のコマンドを実行することでSNSトピックへのメッセージが発行できます。

aws sns publish \
  --topic-arn arn:aws:sns:${AWS_REGION}:${AWS_ACCOUNT_ID}:${SNS_TOPIC_NAME} \
  --message file://${MESSAGE_FILE_NAME}

また以下のコマンドによりSQSキューのメッセージが取得できます。

aws sqs receive-message --queue-url ${SQS_QUEUE_URL}

あとはシステムAからSNSへメッセージを発行する部分と、システムBからSQSキューへメッセージを取りに行く部分を作成することでシステム全体が完成します。この部分についてはシステムAおよびシステムBで用いる言語ごとのそれぞれのライブラリのドキュメントをご参照ください。

まとめ

Amazon SNSとSQSを用いることで高速、高可用性、疎結合なPub/Subモデルのメッセージング機構を構築しました。また今回はCloudFormationによりAWSリソースを定義しました。実際の利用にあたっては今回触れていない細かなパラメーターの設定やデッドレターキューの利用などもぜひご検討ください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サーバーレスな郵便番号検索APIを作成する方法

概要

AWSでサーバーレスな郵便番号検索をつくってみたの手順書です。
ファイルを置いて、プログラムを少し書くだけ簡単にできます。

必要なもの

AWSアカウント

構成

・ S3 : 郵便番号のCSVを格納

・ S3 Select : S3のデータをSQLライクに抽出する

・ Lambda : S3のCSVからレスポンスを返すメソッド

・ API GetWay : Lambdaの内容をAPI化する

Step1:郵便局のCSVダウンロード

日本郵政のページから以下CSVをダウンロード。
文字コードがShiftJISなので、UTF8に変換しておく。

https://www.post.japanpost.jp/zipcode/download.html

またSQLをわかりやすくかけるように、以下のヘッダーを付与する。

JISCode,OldPostCode,PostCode,PrefecturesNameKana,CityNameKana,TownNameKana,PrefecturesName,CityName,TownName,Note1,Note2,Note3,Note4,Note5,Note6

Step2:S3にCSVデータをアップロード

バケットを作成の上、対象のCSVファイルをアップロード

S3 Management Console 2019-12-30 20-53-20.png

Step3:S3 Selectを試してみる

S3 Selectタブ選択して、画面下の次へを押す。

S3 Management Console 2019-12-30 18-38-30.png

SQLが入力できることを確認

S3 Management Console 2019-12-30 18-39-05.png

Step4:Lambdaを作成

 ・ 言語はPython

 ・ 作成後、IMAロールにS3の読み取り権限を付与する

S3Select - Lambda 2019-12-30 18-41-52.png

 ・ 対象のロールからS3ReadOnlyAccessを付与する

IAM Management Console 2019-12-31 07-52-41.png

 ・ ソースコードは以下にて作成

import boto3

BUCKET_NAME = 'XXXXXX'
OBJECT_KEY = 'XXXXXX.CSV'
COMPRESSION_TYPE = 'NONE'

def lambda_handler(event, context):
    # APIのパラメーター
    postcode = event['postcode']
    # S3 Select
    query = 'select * from s3object s where PostCode =\'' + postcode + '\''
    s3 = boto3.client('s3')

    #S3.Client.select_object_contentの設定
    response = s3.select_object_content(
        Bucket=BUCKET_NAME,
        Key=OBJECT_KEY,
        ExpressionType='SQL',
        Expression=query,
        InputSerialization={
            'CSV': {
                'FileHeaderInfo': 'USE',
                'RecordDelimiter': '\n',
                'FieldDelimiter': ',',
            },
            'CompressionType': COMPRESSION_TYPE,
        },
        OutputSerialization={
            'JSON': {
                'RecordDelimiter': '\n'
            }
        }
    )

    # 結果を表示
    for payload in response['Payload']:
        if 'Records' in payload:
            records = payload['Records']['Payload']
            return records

Step5:APIGetWayを作成

 ・ RESTを選択、新しいAPIを選択、適当なAPI名を入力

API Gateway 2019-12-30 18-59-49.png

 ・ メソッドの作成、GETメソッドを選択、統合タイプをLambdaにして、Lambda関数名に上記でセットした名前にする

API Gateway 2019-12-30 19-00-43.png

 ・ 統合リクエストを選択

API Gateway 2019-12-30 19-08-48.png

・ マッピングテンプレートにapplication/jsonと入力して、チェックをつけ、
  テンプレートに設定するGETパラメータの値を入力

API Gateway 2019-12-30 19-13-13.png

・ APIのデプロイを選択。

API Gateway 2019-12-30 19-18-57.png

・ ステージ名をつけて、保存すれば・・・

API Gateway 2019-12-30 19-19-23.png

完成!

完成したURLを叩くと、JSON形式で結果が返ってくる。
PostCodeがパラメーターになっている。

あ.execute-api.ap-northeast-1.amaz.png

↓ レスポンス例

image.png

最後に

LamdbaでAPI作れて便利ですが、ただではないです。
Lamdbaは呼ばれるたびにお金がかかります。

あとパフォーマンスは要チェックです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サーバーレスな郵便番号検索APIを作成してみた

概要

AWSでサーバーレスな郵便番号検索をつくってみたの手順書です。
ファイルを置いて、プログラムを少し書くだけ簡単にできます。

必要なもの

AWSアカウント

利用するサービス

・ S3 : 郵便番号のCSVを格納

・ S3 Select : S3のデータをSQLライクに抽出する

・ Lambda : S3のCSVからレスポンスを返すメソッド

・ API GetWay : Lambdaの内容をAPI化する

Step1:郵便局のCSVダウンロード

日本郵政のページから以下CSVをダウンロード。
文字コードがShiftJISなので、UTF8に変換しておく。

https://www.post.japanpost.jp/zipcode/download.html

またSQLをわかりやすくかけるように、以下のヘッダーを付与する。

JISCode,OldPostCode,PostCode,PrefecturesNameKana,CityNameKana,TownNameKana,PrefecturesName,CityName,TownName,Note1,Note2,Note3,Note4,Note5,Note6

Step2:S3にCSVデータをアップロード

バケットを作成の上、対象のCSVファイルをアップロード

S3 Management Console 2019-12-30 20-53-20.png

Step3:S3 Selectを試してみる

S3 Selectタブ選択して、画面下の次へを押す。

S3 Management Console 2019-12-30 18-38-30.png

SQLが入力できることを確認

S3 Management Console 2019-12-30 18-39-05.png

Step4:Lambdaを作成

 ・ 言語はPython

 ・ 作成後、IMAロールにS3の読み取り権限を付与する

S3Select - Lambda 2019-12-30 18-41-52.png

 ・ 対象のロールからS3ReadOnlyAccessを付与する

IAM Management Console 2019-12-31 07-52-41.png

 ・ ソースコードは以下にて作成

import boto3

BUCKET_NAME = 'XXXXXX'
OBJECT_KEY = 'XXXXXX.CSV'
COMPRESSION_TYPE = 'NONE'

def lambda_handler(event, context):
    # APIのパラメーター
    postcode = event['postcode']
    # S3 Select
    query = 'select * from s3object s where PostCode =\'' + postcode + '\''
    s3 = boto3.client('s3')

    #S3.Client.select_object_contentの設定
    response = s3.select_object_content(
        Bucket=BUCKET_NAME,
        Key=OBJECT_KEY,
        ExpressionType='SQL',
        Expression=query,
        InputSerialization={
            'CSV': {
                'FileHeaderInfo': 'USE',
                'RecordDelimiter': '\n',
                'FieldDelimiter': ',',
            },
            'CompressionType': COMPRESSION_TYPE,
        },
        OutputSerialization={
            'JSON': {
                'RecordDelimiter': '\n'
            }
        }
    )

    # 結果を表示
    for payload in response['Payload']:
        if 'Records' in payload:
            records = payload['Records']['Payload']
            return records

Step5:APIGetWayを作成

 ・ RESTを選択、新しいAPIを選択、適当なAPI名を入力

API Gateway 2019-12-30 18-59-49.png

 ・ メソッドの作成、GETメソッドを選択、統合タイプをLambdaにして、Lambda関数名に上記でセットした名前にする

API Gateway 2019-12-30 19-00-43.png

 ・ 統合リクエストを選択

API Gateway 2019-12-30 19-08-48.png

・ マッピングテンプレートにapplication/jsonと入力して、チェックをつけ、
  テンプレートに設定するGETパラメータの値を入力

API Gateway 2019-12-30 19-13-13.png

・ APIのデプロイを選択。

API Gateway 2019-12-30 19-18-57.png

・ ステージ名をつけて、保存すれば・・・

API Gateway 2019-12-30 19-19-23.png

完成!

完成したURLを叩くと、JSON形式で結果が返ってくる。
PostCodeがパラメーターになっている。

あ.execute-api.ap-northeast-1.amaz.png

↓ レスポンス例

image.png

最後に

LamdbaでAPI作れて便利ですが、ただではないです。
Lamdbaは呼ばれるたびにお金がかかります。

あとパフォーマンスは要チェックです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Capistranoでの自動デプロイでエラーが起きた際の対処方法

この記事について

 この記事では、自身がRailsで開発しているアプリをCapistranoでデプロイをしようとした時にエラーが発生し、解決するまでに試した作業を書いています。
 同様のエラーが起きた際に自分が読み返すために書いていますが、他の方の参考にもなれば嬉しいです。

エラーが起こった時の状況

 Capistranoでデプロイの流れを自動化しており、ある日デプロイをしようとしたところ、deploy:migrating実行時にエラーが発生し、デプロイができませんでした。
 ローカル環境では動作に問題がなかったため、サーバー環境に問題があると考えました。

エラー解決までに行った作業

  • AWSサービスの再起動
  • unicornの再起動
  • nginxの再起動
  • MySQLの再起動

 こうして書いてみると、ひたすら再起動しているだけのような気がしてきました。

1.AWSサービスの再起動

 amazonコンソールからサインインし、EC2インスタンスの管理画面を開きます。
 該当するアプリが選択された状態で、「アクション→インスタンスの状態→停止」、「アクション→インスタンスの状態→開始」の順で行います。
 再起動を選択しても良さそうですが、学習のために開発中のアプリであることと、再起動で上手く行かなかった時に停止→開始とやり直すのが面倒だったため、今回は最初から停止→開始の作業を行いました。
 他のアプリを開発中にも直面しましたが、解決策が分からない時にインスタンスの再起動を行うとあっさり解決することがあったりします。

2.unicornの再起動

 以降はコンソールからサーバーにログインした上で作業を行います。cd /var/www/アプリ名などを実行し、アプリが保存されているフォルダに移動してから作業してください。

unicornの停止
ps aux | grep unicorn  # 起動中のunicornプロセスを確認

# 起動中のunicorn master -c ...がある場合、停止させる
kill 0000 #上記で確認したプロセス番号を入力
unicornの起動
RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D

3.nginxの再起動

nginxの再起動
# nginxの停止
sudo service nginx stop

# nginxの開始
sudo service nginx start

# nginxの状況確認
sudo service nginx status
# -> nginx (pid 0000) is running...

4.MySQLの再起動

MySQLの再起動
sudo service mysqld restart
# nginxと同様の作業でも再起動は可能

結果

 以上の作業を行うことで、無事にデプロイが行えるようになりました。
 上の作業を全て連続して行ったため、具体的にどの部分が原因でデプロイできなかったのかまでは分かりませんでした。ですが原因を追求するつもりもありませんでしたし、問題があった時の再起動は不都合がない限り全て行って差し支えないと考えます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Lambdaのログをtailする

はじめに

AWSマネジメントコンソールでAWS Lambdaのログを確認するのは面倒だ。
そう思ってググったんだが、当時、それっぽいことをやってる事例を見つけられなかった。

さて、AWS LambdaのログはCloudWatchログに記録され、次のような構造をしてる。

CloudWatchログでは、個々の記録をイベントと呼んでるようだ。
一連のイベントをひとまとまりにしたものを、ログストリームと呼んでるようだ。
ログストリームは関数ごとにまとめられており、それをロググループと呼んでるようだ。

これを踏まえると、tailは次のような流れになる。

tailしたいロググループを特定する
while True:
    tailしたいロググループから最も新しいログストリームを見つける
    if 見つけたログストリームの最初の取得だったら:
        ログストリーム内のイベントを最初から取得する
    else:
        ログストリーム内の続きのイベントを取得する
    少し待つ

Pythonで書いたので

とりあえずboto3のインポートは必要となる。

#!/usr/bin/python3

import boto3

CloudWatch Logsのクライアントを作成する

# 最も単純な場合
aws_cwl_client = boto3.client('logs')
# プロファイル指定が必要ある場合
aws_cwl_client = boto3.session.Session(
    profile_name='プロファイル名').client('logs')
# プロファイルに加えてリージョン指定が必要ある場合
aws_cwl_client = boto3.session.Session(
    profile_name='プロファイル名',
    region_name='リージョン名').client('logs')

ロググループ名の一覧は次のように取得できる

log_group_list = []
response = aws_cwl_client.describe_log_groups()
while True:
    for value in response['logGroups']:
        log_group_list.append(value['logGroupName'])
    if 'nextToken' not in response:
        break
    response = aws_cwl_client.describe_log_groups(nextToken=response['nextToken'])
print(log_group_list)
# ロググループ名の一覧が表示される

tail本体は次のようになる

log_group_name = 'tailしたいロググループの名前'
stream = ''
next_token = ''
while True:
    response = cwl.describe_log_streams(
        logGroupName=log_group_name,
        orderBy='LastEventTime',
        descending=True,
        limit=1)
    if stream != response['logStreams'][0]['logStreamName']:
        stream = response['logStreams'][0]['logStreamName']
        print('---- %s ----' % stream)
        next_token = ''
    if next_token == '':
        response = cwl.get_log_events(
            logGroupName=group, logStreamName=stream)
    else:
        response = cwl.get_log_events(
            logGroupName=group, logStreamName=stream, nextToken=next_token)
    if len(response['events']) > 0:
        for value in response['events']:
            msg = value['message']
            if msg.startswith('START RequestId: '):
                temp = time.strftime(
                    '%Y-%m-%dT%H:%M:%S',
                    time.localtime(value['timestamp'] / 1000))
                print('---- %s.%0d ----' % (temp, value['timestamp'] % 1000))
            print(msg.replace('\r', '\n').replace('\n\n', '\n').rstrip())
        next_token = response['nextForwardToken']
    time.sleep(3)

補足

いまググったら、awslogsが見つかった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Route53を使用してEC2にドメイン名を紐づける

概要

Route53を使用して取得しているドメイン名をEC2に紐づけます。またEC2にapacheをインストールし、インターネット上からHTMLが表示できるようにします。

0. 前提条件

  • AWSのアカウントを取得していること。
  • AWSのセキュリティ対策として、IAMや多要素認証をしていること。
  • お名前.comなどでドメインを取得していること。
  • 本書ではWindows10 Proを使用します。

1. Route53に取得したドメインを紐づける

  1. AWSマネジメントコンソールにログインし、「サービス」→「Route53」をクリックする。
    route53_001.JPG

  2. 「DNS管理」→「今すぐ始める」をクリックする。
    route53_002.JPG

  3. 「ホストゾーンの作成」をクリックする。
    route53_003.JPG

  4. 「ホストゾーンの作成」をクリックする。
    route53_004.JPG

  5. ドメイン名にお名前.comなどで取得したドメイン名を入力し「作成」をクリックする。
    route53_005.JPG

  6. お名前.comなどのネームサーバー登録画面にて、レコードセット作成時に表示されたネームサーバを登録する。
    route53_007.JPG

route53_010.JPG

2. EC2を作成する

  1. 「サービス」→「EC2」をクリックする。
    route53_011.JPG

  2. 左側メニューから「インスタンス」をクリックする。
    route53_012.JPG

  3. 「インスタンスの作成」をクリックする。
    route53_013.JPG

  4. 「Amazon Linux 2」を選択する。
    route53_014.JPG

  5. 「t2.micro」を選択し、「次のステップ:インスタンスの詳細の設定」をクリックする。
    route53_015.JPG

  6. 設定内容を確認し、「次のステップ:ストレージの追加」をクリックする。
    route53_016.JPG

  7. 容量を確認し「次のステップ:タグの追加」をクリックする。
    route53_017.JPG

  8. タグの設定内容を確認し「次のステップ:セキュリティグループの設定」をクリックする。
    route53_018.JPG

  9. セキュリティグループを設定し、「確認と作成」をクリックする。
    route53_019.JPG

  10. 設定内容を確認し「起動」をクリックする。
    route53_021.JPG

  11. キーペアの設定を確認し、「インスタンスの作成」をクリックする。
    route53_022.JPG

  12. インスタンスが作成中なので待機する。
    route53_023.JPG

  13. インスタンスが起動したことを確認する。
    route53_024.JPG

3. Elastic IPの設定

  1. EC2の左側メニューから「Elastic IP」をクリックする。
    route53_025.JPG

  2. 「Elastic IPアドレスの割り当て」をクリックする。
    route53_026.JPG

  3. Elastic IPアドレスが割り当てられたことを確認する。
    route53_027.JPG

  4. 「アクション」→「Elastic IPアドレスの関連付け」をクリックする。
    route53_028.JPG

  5. Elastic IPアドレスを関連付けるインスタンスを選択し、「関連付ける」をクリックする。
    route53_029.JPG

  6. Elastic IPアドレスがインスタンスに関連付けられたことを確認する。
    route53_030.JPG

4. Elastic IPとRoute53を紐づける

  1. 「サービス」→「Route53」をクリックする。
    route53_031.JPG

  2. 「ホストゾーン」をクリックする。
    route53_032.JPG

  3. 「ドメイン名」をクリックする。
    route53_033.JPG

  4. 「レコードセットの作成」をクリックする。
    route53_034.JPG

  5. 以下の内容を入力し、「作成」をクリックする。

    • 名前 : (任意の名前)
    • タイプ : A - IPv4アドレス
    • 値 : Elastic IPのIPアドレス
      route53_035.JPG
  6. Elastic IPが紐づいたことを確認する。
    route53_036.JPG

5. ドメイン名の紐づき確認

  1. TeraTeamなどでインスタンスにログインする。

  2. 下記のコマンドを入力し、ドメイン名がインスタンスに紐づいたか確認する。

    $ nslookup ドメイン名
    Server:     xxx.xxx.xxx.xxx
    Address:    xxx.xxx.xxx.xxx#53
    
    Non-authoritative answer:
    Name:   ドメイン名
    Address: xxx.xxx.xxx.xxx
    

6. apacheのインストール

  1. パッケージをアップデートする。

    $ sudo yum -y update
    
  2. apacheをインストールする。

    $ sudo yum -y install httpd
    
  3. apacheのインストール確認をする。

    $ httpd -v
    Server version: Apache/2.4.41 ()
    Server built:   Oct 22 2019 22:59:04
    
  4. apacheを起動する。

    $ sudo systemctl start httpd
    
  5. ブラウザにElastic IPを入力し、apacheのテストページが表示されることを確認する。
    route53_039.JPG

  6. 同様に紐づけたドメイン名を入力し、apacheのテストページが表示されることを確認する。
    route53_040.JPG

  7. /var/www/html/index.htmlを作成する。

    $ cd /var/www/html/
    $ sudo vi index.html
    <html>
        <head>
                <title>
                route53 test
                </title>
        </head>
        <body>
                <h1>
                hello world route53
                </h1>
                <h2>
                by aws ec2
                </h2>
        </body>
    </html>
    
  8. ブラウザからindex.htmlに接続する。
    route53_041.JPG

最後に

Route53とEC2を組み合わせることでHTMLをインターネット上に公開することができます。これにより作成したホームページやポートフォリオをインターネット上に公開できます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS+NodeJSでサーバレスな環境構築①

はじめに

サーバレスは完全に未経験ですが、勉強がてら備忘録として残しておこうと思います。
表現等が正しく無い場合はご指摘いただければ、幸いです。

サーバレスってなぁに?

簡単に行ってしまうと、ユーザーがサーバー領域を意識せず、直接利用出来るサービスを活用した構成のことです。
「Lambda」は設定されているプログラムを起動させる実行環境となります。起動条件が整った際に、プログラムをLambda環境に呼び出し、実行されます。この為、Lambdaでは、実行した時間とその回数のみの課金となります。

向いているサービス
・待機時間の長いシステム
・CPUの負荷が時間帯によって差のあるシステム

不向きなサービス
・常にシステムの動いている必要のあるサービス
・高負荷な状態が長時間続くシステム

もう少し詳しいことを知りたい場合はこちらのサイトをご覧ください。
サーバーレス アーキテクチャ

Lambda関数の作成

・AWS Lambdaページ>関数の作成>一から作成
・関数名を入力、ランタイムの選択(必要であれば)
・その他はデフォルト値のままで作成ボタン

API Gatewayのトリガーを追加と設定

・「トリガーを追加」ボタンを押し、API Gatewayを選択
・APIを「新規のAPI」を選択
・その他はデフォルト値のままで追加ボタン

ソース

index.js
'use strict'

let fs = require('fs')
let path = require('path')

exports.handler = (event, context, callback) => {


  let filePath = path.join(__dirname, 'page.html')
  let html = fs.readFileSync(filePath).toString()

  sendHtmlResponse(context, 200, html)

}

function sendHtmlResponse(context, statusCode, html) {
  let response = {
    'statusCode': statusCode,
    'headers': {
      'Content-Type': 'text/html'
    },
    'body': html
  }
  context.succeed(response)
}
page.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>サーバレス</title>
</head>

<body>
    <h1>やっちゃおう!サーバレスで</h1>
</body>
</html>

ページにアクセス

API Gatewayの設置したトリガーをクリックし、表示されてるURLをクリックすれば、アクセスできるはずです。
スクリーンショット 2019-12-30 17.28.03.png
遷移先のページでこのように表示されれば、成功です。
スクリーンショット 2019-12-30 18.21.51.png

終わりに

次はLambdaとdynamodbやS3と組み合わせて投稿しようかと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Transit Gatewayを導入するときに気をつけたいポイント4選

0.はじめに

以下のような構成でVPC-AとVPC-Bを接続するためにTransit Gatewayを導入することを検討していました。検討時に気をつけたことやはまったことを共有します。

TransitGWを使うときに気をつけるポイント-全体像.png

1.Transit Gatewayのデフォルトのルートテーブルを使うかどうか

Transit Gatewayにはデフォルトのルートテーブルが備わっています。これを用いることでTransit Gatewayにアタッチ/アソシエート/プロパゲートした任意のVPCの組み合わせで通信できます。一方、デフォルトのルートテーブルを使わない場合は、通信させたいVPCの組み合わせをTransit Gatewayのルートテーブルに設定していくことになります。

Transit Gatewayを経由するVPC間の通信が、1対1で決まることが多いのであれば独自のルートテーブルを使う、逆に複数のVPCと通信したい場合はデフォルトのルートテーブルを用いるのが良いのではないでしょうか。設定が煩雑になって運用がしにくくなるためです。デフォルトのルートテーブルを使った場合でも、各セキュリティグループやACLでIngressの通信を制御することもできます。

2.インターネット接続を集約するかどうか

インターネットへのEgressの口を各VPCごとに持つのか、あるVPCのpublicサブネットに集約するのかどうか、というのは一つの検討ポイントだと思います。集約する場合の検討ポイントとして、Transit GatewayやNAT Gateway、Internet Gatewayの可用性を考えておく必要があります。
Transit Gatewayの制限事項としては以下のような項目があります。帯域に関してはVPC間を接続する場合は最大でバースト 50 Gbps出るので、Transit Gateway自体の帯域が不足することはまずないでしょう。帯域に関してはInternet Gatewayは無制限、NAT Gatewayも 5 Gbpsの帯域をサポートして 45 Gbps まで自動的に拡張するので、集約したとしても問題ないと考えられます。

Transit Gatewayのパフォーマンスと制限

制限 デフォルト
AWS Transit Gateway アタッチメントの数 5000
VPN 接続ごとの最大帯域幅* 1.25 Gbps
VPC、Direct Connect Gateway、またはピア Transit Gateway 接続あたりの最大帯域幅 (バースト) 50 Gbps
アカウントあたりの AWS Transit Gateway の数 5
VPC あたりの AWS Transit Gateway アタッチメントの数 5
ルートの数 10000
AWS Transit Gateway あたりの Direct Connect Gateway の数 20

https://aws.amazon.com/jp/transit-gateway/faqs/
https://aws.amazon.com/jp/vpc/faqs/
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html

3.インターネット接続を集約するときのルートテーブルの設定

インターネットに接続しない、純粋にVPC間をTransit Gatewayで接続する場合は Transit GatewayでVPC間通信する構成をTerraformで作成してみた で説明されている手順でできます。

ここで、例えばB-VPCからインターネットに抜ける通信を考えてみます。以下のようなイメージです。

TransitGWを使うときに気をつけるポイント-インターネット.png

Transit Gateway越しにインターネットに抜ける場合ポイントは以下です。

  1. publicサブネットを持たないVPC(本説明の場合はB-VPC)にあるサブネットのデフォルトゲートウェイはTransit Gateway
  2. publicサブネットを持つVPC(本説明の場合はA-VPC)の publicサブネット のルートテーブルに、B-VPCのCIDRに含まれる宛先IPアドレスの通信の経路を Transit Gateway宛 に設定する
  3. Transit Gatewayのデフォルトのルートテーブルにstaticな経路としてデフォルトルートをpublicサブネットを持つVPC(本説明の場合はA-VPC)宛に設定する

ということです。私がはまったポイントとして、A-VPC側のpublicのルートテーブルにはA-VPCの(Transit Gatewayとアタッチ/アソシエート/プロパゲートしている)private側へのルートを設定していたため通信できず、はまりました。

4.同じアベイラビリティゾーンを使って通信する

仕様的な話なので知っておけばOKです。が見落としそうなポイントでもありそうです。可用性や拡張性設計の際に注意しましょうということなのですが、同一のAZをENIを経由して通信します。BlackBeltの資料や以下のClassmethodさんの記事にもあります。

x.落ち葉拾い

Terraformを使った場合、デフォルトのTransit Gatewayのルートテーブルは自動で作成されるため、staticなルートを追加したい場合、手動で追加しないといけませんでした。以下のような tf ファイルでリソースを生成したときに生成されるデフォルトのルートテーブルのIDを取得できるとよいのですが、取得方法わからずです。data で作成したリソースを元に追加するのが良いのかも知れません。

resource aws_ec2_transit_gateway test {
  vpn_ecmp_support                = "disable"
  default_route_table_association = "enable"
  default_route_table_propagation = "enable"
  auto_accept_shared_attachments  = "disable"
  tags = {
    Name = "test_transit_gateway"
  }
}

Terraformで検証環境を構築したときのtfファイルたちは こちら に置いておきました。

参考

全般的に以下の資料が参考になります。Transit Gatewayを導入する際はぜひ読んでおく資料かと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS IoT】モノにアタッチされていない証明書を削除する

目的

AWS IoTにおいて、モノにアタッチされていない証明書を削除する。
不要な証明書を大量に作成してしまった場合用。

クラス

import boto3

class CertKiller():

    def __init__(self):
        # AWS IoTを操作するクラスをインスタンス化
        self.client = boto3.client('iot')

        return


    def delete_not_attached_cert_all(self):
        '''
        モノにアタッチされていない証明書を削除
        '''
        # 証明書情報のリストを取得
        list_cert = self.get_list_cert()

        # モノにアタッチされていない証明書を削除
        for cert in list_cert:
            self.__delete_not_attached_cert(cert)

        return


    def get_list_cert(self):
        '''
        証明書情報のリストを取得
        '''
        list_cert = self.client.list_certificates(pageSize=100)['certificates']

        return list_cert 


    def __delete_not_attached_cert(self, cert):
        '''
        証明書がどのモノにもアタッチされていなかった場合、削除
        '''
        # 証明書情報を取得
        cert_arn = cert['certificateArn']
        cert_id = cert['certificateId']

        # 証明書をアタッチしてあるモノの一覧を取得
        thing_attached_cert = self.client.list_principal_things(principal=cert_arn)['things']
        print(cert_arn, thing_attached_cert)

        # 証明書がどのモノにもアタッチされていなかった場合、削除
        if len(thing_attached_cert) == 0:
            self.__delete_cert(cert_arn, cert_id)
        else:
            pass

        return


    def __delete_cert(self, cert_arn, cert_id):
        '''
        証明書を削除
        '''    
        # 削除前に無効化する必要がある
        self.client.update_certificate(certificateId=cert_id, newStatus='INACTIVE')

        # 削除前にポリシーをデタッチする必要がある
        self.__detach_all_policy(cert_arn, cert_id)

        # 削除
        self.client.delete_certificate(certificateId=cert_id, forceDelete=False)
        print('{} has been deleted.'.format(cert_arn))

        return


    def __detach_all_policy(self, cert_arn, cert_id):
        '''
        証明書にアタッチされている全てのポリシーをデタッチ
        '''    
        # 証明書にアタッチされているポリシーのリストを取得
        list_policy = self.client.list_attached_policies(target=cert_arn)['policies']

        # デタッチ
        for policy in list_policy:
            policy_name = policy['policyName']
            self.client.detach_policy(policyName=policy_name, target=cert_arn)

        return

実行

cert_killer = CertKiller()
cert_killer.delete_not_attached_cert_all()

備考

  • もし使用いただける場合は自己責任でお願いします。
  • デバイスにアタッチされている証明書が削除される心配はありません。
    delete_certificate() で forceDelete=Falseとしているため)
  • モノにアタッチされていない=不要 とは限らないと思いますので、
    複数名でAWS IoTを使用している場合は、削除前に他のユーザーに確認を取ると良いと思います。

感想

めちゃめちゃ初心者なので、本当に些細なことでもご指摘・コメント等いただけますと幸いです。

参照

Boto 3 Documentation

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】サービス一覧をまとめてみた

●初めに
SAA受験でAWSのサービスを学習したので、備忘としてまとめたいと思います。

●EC2

●Lambda
△what
インフラを一切気にすることなく、アプリケーションコードを実行できるコンピュータサービス
 -実行基盤はAWSが管理
 -AWSサービスと連携可能
 -コード実行時間に対しての従量課金

△why
ビジネスロジックのみに集中できる
→インフラを考慮しなくて良い為

オートスケール可能
→イベントの発生頻度に合わせて自動でスケール

△how
コード
→JavaScript(Node.js),JAVA

メモリ
→Node.jsは128MB,JAVAは512MB

タイムアウト
→Node.jsは3秒,JAVAは15秒
→最大60秒

実行環境
→それぞれが隔離されたコンテナで実行

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Webシステム構築(超基礎)④:Webシステムの構築

目的

Webシステム構築(超基礎)②:APサーバ構築と基本動作Webシステム構築(超基礎)③:DBサーバ構築と基本動作で構築したWeb/APサーバとDBサーバを用い、Webシステムを構築する。

環境条件

  • APサーバ
    • EC2:t2.micro
    • OS:Red Hat Enterprise Linux 8 (HVM), SSD Volume Type
    • Disk:汎用SSD(GP2) 10GB
    • Tomcat:Apache Tomcat 9
    • Java:JDK 1.8
  • DBサーバ
    • EC2:t2.micro
    • OS:Red Hat Enterprise Linux 8 (HVM), SSD Volume Type
    • Disk:汎用SSD(GP2) 10GB
    • MySQL:MySQL 8

セキュリティグループの設定等はいい感じに。

構築手順

以下の流れで実施する。
1. Web/APサーバOSからDBサーバのMySQLに接続できる状態にする
2. Web/APサーバからDBサーバのMySQLに接続できる状態にする
3. データベースへのデータ登録
4. アプリケーションの準備
5. 動作確認

1. Web/APサーバOSからDBサーバのMySQLに接続できる状態にする

DBサーバにec2-userでログイン

rootユーザにスイッチ
$ sudo su - 

MySQLにログイン
#mysql -uroot -ppassword

接続許可ユーザの確認
> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

接続用ユーザの作成
> CREATE USER 'appuser'@'%' IDENTIFIED BY 'appuser';

appuserの権限を変更
> GRANT ALL ON *.* TO 'appuser'@'%';

appuserが全ての場所から接続できる状態になっていることを確認する
> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| appuser          | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

2. Web/APサーバからDBサーバのMySQLに接続できる状態にする

ドライバーのダウンロード
# curl -O https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12.jar

Tomcatのlibディレクトリにドライバーを配置
# mv mysql-connector-java-8.0.12.jar /opt/apache-tomcat-9.0.30/lib/

ドライバーにシンボリックリンクを貼る
# cd /opt/apache-tomcat-9.0.30/lib/
# ln -s mysql-connector-java-8.0.12.jar mysql-connector-java.jar

3. データベースへのデータ登録

サンプルデータをデータベースに登録するためのSQL情報を取得
# curl -O https://downloads.mysql.com/docs/world.sql.zip

unzipのインストール
# yum install -y unzip

SQLファイルの解凍
# unzip world.sql.zip 

DBにサンプルデータを投入する
# mysql -uappuser -pappuser  < world.sql

MySQLにログイン
# mysql -uappuser -pappuser

worldデータベースが追加されていることを確認する
> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| world              |
+--------------------+

worldデータベースに含まれる表を確認する
> use world;
> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+

各表定義は以下の様になっており、


> desc city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+

> desc country;
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field          | Type                                                                                  | Null | Key | Default | Extra |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Code           | char(3)                                                                               | NO   | PRI |         |       |
| Name           | char(52)                                                                              | NO   |     |         |       |
| Continent      | enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') | NO   |     | Asia    |       |
| Region         | char(26)                                                                              | NO   |     |         |       |
| SurfaceArea    | decimal(10,2)                                                                         | NO   |     | 0.00    |       |
| IndepYear      | smallint(6)                                                                           | YES  |     | NULL    |       |
| Population     | int(11)                                                                               | NO   |     | 0       |       |
| LifeExpectancy | decimal(3,1)                                                                          | YES  |     | NULL    |       |
| GNP            | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| GNPOld         | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| LocalName      | char(45)                                                                              | NO   |     |         |       |
| GovernmentForm | char(45)                                                                              | NO   |     |         |       |
| HeadOfState    | char(60)                                                                              | YES  |     | NULL    |       |
| Capital        | int(11)                                                                               | YES  |     | NULL    |       |
| Code2          | char(2)                                                                               | NO   |     |         |       |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+

> desc countrylanguage;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3)       | NO   | PRI |         |       |
| Language    | char(30)      | NO   | PRI |         |       |
| IsOfficial  | enum('T','F') | NO   |     | F       |       |
| Percentage  | decimal(4,1)  | NO   |     | 0.0     |       |
+-------------+---------------+------+-----+---------+-------+

4. アプリケーションの準備

JSPとJavaプログラムを利用した簡単なWebアプリケーションを構築し、APサーバ上で動作させる。
Web画面上で国名を入力し検索すると、主要5都市とその人口、また公用語とその利用割合を、
DB検索を実施しながら表示するプログラムである。

world.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>

<!DOCTYPE html>
<html>
    <head>
        <title>requestForm</title>
    </head>
    <body>
        <p>各国の主要都市と公用語の検索</p>

        <%-- GETメソッドでテキストを送信 --%>
        <form action="./WorldServlet">
            <p>
                国名(英語表記)を入力してください:<input type="text" name="text1"><br>
                例)日本の場合はJapanと入力
            </p>
            <input type="submit" value="検索実行">
        </form>
</html>
WorldServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.NumberFormat;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/WorldServlet")
public class WorldServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * コンストラクタ.
     */
    public WorldServlet() {
        super();
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String inputText = "";  // テキスト1格納用変数

        inputText = request.getParameter("text1");

        String servername     = "172.31.45.98";
        String databasename   = "world";
        String user = "appuser";
        String password = "appuser";
        String serverencoding = "UTF-8";
        String url =  "jdbc:mysql://" + servername + "/" + databasename + "?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B9:00&rewriteBatchedStatements=true";

        Connection con = null;

        try {
            Class.forName( "com.mysql.cj.jdbc.Driver" ).newInstance();
            con = DriverManager.getConnection( url, user, password );
            Statement stat = con.createStatement();
            String sqlStr1 = "select country.name, city.name, city.population from city inner join country on city.countrycode=country.code  where country.name='" + inputText + "' order by city.population desc limit 5;";
            String sqlStr2 = "select country.name, countrylanguage.language, countrylanguage.percentage from country inner join countrylanguage on country.code=countrylanguage.countrycode where country.name='" + inputText + "' order by countrylanguage.percentage desc limit 1;";
            System.out.println("sqlStr1: " + sqlStr1);
            System.out.println("sqlStr2: " + sqlStr2);

            ResultSet resultset1 = stat.executeQuery( sqlStr1 );

            String country_name = null;
            String city_name = null;
            Integer city_population = 0;
            String countrylanguage_language = null;
            Double countrylanguage_percentage = 0.0;

            //NumberFormatインスタンスを生成
            NumberFormat nfNum = NumberFormat.getNumberInstance();    //カンマ区切り形式
            NumberFormat nfPer = NumberFormat.getPercentInstance();   //パーセント形式

            // 画面に出力する内容の設定
            // 出力する内容がHTMLであることを設定
            response.setContentType("text/html");
            // 出力する画面の文字コードをUTF-8に設定
            response.setCharacterEncoding("UTF-8");

            // 画面に出力するためのWriterクラスインスタンスを取得
            PrintWriter pw = response.getWriter();

            // HTMLを出力
            pw.println("<html>");
            pw.println("<head>");
            pw.println("<title>入力結果</title>");
            pw.println("</head>");
            pw.println("<body>");
            pw.println("<h1>検索結果</h1>");
            pw.println("<h2>" + inputText + "の主要都市とその人口は以下である</h2>");
            pw.println("<table border='1'>");
            pw.println("<tr>");
            pw.println("<th>都市名</th>");
            pw.println("<th>人口</th>");
            pw.println("</tr>");
            while( resultset1.next() )
            {
                /*getString()メソッドは、引数に指定されたフィールド名(列)の値をStringとして取得する*/
                city_name = resultset1.getString("city.name");
                city_population = resultset1.getInt("city.population");
                System.out.print("都市名:" + city_name);
                System.out.print("都市の人口:" + city_population);
                pw.println("<tr>");
                pw.println("<th>"+ city_name +"</th>");
                pw.println("<th>"+ nfNum.format(city_population) +"人</th>");
                pw.println("</tr>");

            }
            pw.println("</table>");
            resultset1.close();

            ResultSet resultset2 = stat.executeQuery( sqlStr2 );

            pw.println("<h2>" + inputText + "の公用語とその利用割合は以下である</h2>");
            pw.println("<table border='1'>");
            pw.println("<tr>");
            pw.println("<th>公用語</th>");
            pw.println("<th>利用割合</th>");
            pw.println("</tr>");
            while( resultset2.next() )
            {
                /*getString()メソッドは、引数に指定されたフィールド名(列)の値をStringとして取得する*/
                countrylanguage_language = resultset2.getString("countrylanguage.language");
                countrylanguage_percentage = resultset2.getDouble("countrylanguage.percentage");
                System.out.print("公用語:" + countrylanguage_language);
                System.out.print("利用割合:" + countrylanguage_percentage);
                pw.println("<tr>");
                pw.println("<th>"+ countrylanguage_language +"</th>");
                pw.println("<th>"+ nfPer.format(countrylanguage_percentage / 100) +"</th>");
                pw.println("</tr>");

            }
            pw.println("</table>");

            resultset2.close();
            stat.close();
            con.close();

            pw.println("</body>");
            pw.println("</html>");       
        } 
        catch( SQLException e ){

            /*エラーメッセージ出力*/
            System.out.println( "Connection Failed. : " + e.toString() );

            /*例外を投げちゃうぞ*/
            try {
                throw new Exception();
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

        }catch (ClassNotFoundException e){

            /*エラーメッセージ出力*/
            System.out.println("ドライバを読み込めませんでした " + e);
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            try{
                if( con != null ){ 
                    con.close();
                }
            }
            catch(Exception e){

                /*エラーメッセージ出力*/
                System.out.println( "Exception2! :" + e.toString() );

                /*例外を投げちゃうぞ*/
                try {
                    throw new Exception();
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }

    }
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">

    <servlet>
        <servlet-name>WorldServlet</servlet-name>
            <servlet-class>WorldServlet.WorldServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>WorldServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

以下の様にアプリケーションを配置する。

/opt/apache-tomcat-9.0.30/webapps/world

world
├── WEB-INF
│   ├── lib
│   │   └── World.jar
│   └── web.xml
└── world.jsp

5. 動作確認

Tomcatサービスを再起動する
# service tomcat restart
Redirecting to /bin/systemctl start tomcat.service

ブラウザからWebサーバの「パブリックDNS:8080/world/world.jsp」に接続し、
作成したWebページの表示及び、処理の動作が正しく行われることを確認する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者向け】AssumeRole利用時のEKSクラスター作成について

この記事は Amazon EKS Advent Calendar 2019 の16日目の記事です。
公開が遅くなってしまい申し訳ありません

AWSの利用が進むにつれ、複数のAWSアカウントを利用することが多くなります。
開発、STG、本番と環境を分けるために利用したり、「課金管理を行いたい」、「プロジェクトが違う」など理由は様々ですが、複数のAWSアカウントごとにIAMユーザを発行するとアカウント管理が煩雑になってしまうため、1つのAWSアカウントからAssume Roleを利用して各AWSアカウントにアクセスする方法を採用されている方も多くいるかと思います。

今回は、このような環境で、Assume Roleを利用しながら、EKSクラスタを作成し、そこにアクセスするまでを整理したいと思います。
Kubernetesは使い慣れているが、AWSは不慣れ、という方や、 複数のAWSアカウント利用に慣れていない方の助けになれば幸いです。

なお、今回は例として下記のようなアカウント構成を想定します。

Qiita_assume_role.png

利用者の方は管理用アカウントにIAM Userとしてログインし、作業対象アカウントにAssume Roleを利用してアクセスして実際の作業を行います。

Assume Roleを利用した他アカウントへのアクセスについては下記のdocumentもご覧ください。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html

EKSの構築についてはこちらで紹介されているeksctlの開始方法コンソールの開始方法 それぞれのシナリオをAssume Roleで実施する方法について記載します。

「eksctlの開始方法」 の場合

eksctlを利用する場合、eksctlの開始方法前提条件 でも説明されている通り、何も指定しない場合、AWS CLIのdefault プロファイルの認証情報が利用されます。
今回想定している構成の場合、利用者の方は管理用アカウントのIAM Userのアクセスキー/シークレットアクセスキーをお持ちのはずなので、このままこちらの手順を実行すると、管理用アカウント上にEKS クラスタが作成されてしまいます。

管理用アカウント上にEKS クラスタが作成されてしまう

Qiita_assume_role_not_assume.png

本来は、下記のように作業対象アカウントにEKS クラスタを作成することが目的のはずです。

本来やりたいこと→作業対象アカウントにEKS クラスタを作成したい

Qiita_assume_role_assume.png

手順

上記は下記の手順を実施することで実現できます。

  1. CLI設定ファイルで作業対象アカウントのRoleを利用するように設定する
  2. ドキュメントの手順に沿ってeksctlを利用する際に、1.で設定したプロファイルを指定する

1. CLI設定ファイルで作業対象アカウントのRoleを利用するように設定する

~/.aws/config (Linux または macOS の場合) または C:\Users\USERNAME.aws\config (Windows の場合)に下記の設定を追加します。
(defaultのプロファイルは管理用アカウントのIAM Userが東京リージョンで jsonをoutputとして設定されている前提とします)

~/.aws/config
## defaultのprofile
[default]
region = ap-northeast-1
output = json

## 下記の設定を追加
[profile assume]
role_arn = <作業対象アカウントのroleのarn>
source_profile = default

CLIでIAM Roleを利用するための設定の詳細は下記のドキュメントもご覧ください。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-role.html

正しく設定できたかを確認するために、下記のコマンドを実行してください。

aws sts get-caller-identity --p assume

レスポンスとして、下記のような結果が帰って来れば成功です。

{
    "UserId": "XXXXXXXXXXXXXXXXXXXX:botocore-session-1111111111",
    "Account": "<管理対象のAWSアカウントID>",
    "Arn": "arn:aws:sts::<管理対象のAWSアカウントID>:assumed-role/<Role名>/botocore-session-1111111111"
}

2. ドキュメントの手順に沿ってeksctlを利用する際に、1.で設定したプロファイルを指定する

作業対象アカウントのRoleを利用するAWS CLIのプロファイルの設定はできたので、次はeksctlを実行する際に上記で設定したプロファイルを利用するによう指定します。
eksctl でクラスタを作成する際には、 -p もしくは --profile flagを利用することで利用するプロファイルを指定できます。

こちらの手順で AWS Fargate-only clusterを作成するコマンドを例とすると、下記のようにflagを追加します。

eksctl create cluster \
--name prod \
--version 1.14 \
--region us-east-2 \
--fargate \
-p assume ##追加するflag

利用するプロファイルを指定する環境変数

なお、毎回 -pのflagをつけるのが面倒な場合、下記のようにデフォルトで利用するプロファイルを環境変数で指定することができます。これを設定した場合、AWS CLIやeksctlでプロファイルを指定する必要はありません。

環境変数によるプロファイルの指定
export AWS_PROFILE=assume

設定後、eksctlでプロファイルを指定しないでも、先ほど作成したクラスタを参照できることを下記のコマンドで確認できます。

eksctl get cluster

※環境変数でプロファイルを指定してeksctl create cluster でEKS クラスタを作成した場合、その後のkubectlでのkubernetesの操作時にも AWS_PROFILE の環境変数が設定されている必要があリます。(設定ファイルを書き換えることで変更できますがここでは割愛)

「コンソールの開始方法」の場合

マネジメントコンソールから作成する場合、マネジメントコンソールからAssume Roleで作業対象アカウントにログインして、ステップ 1: Amazon EKS クラスターを作成するの手順を実行します。ここはドキュメントの通り進めれば問題ありません。

ここではステップ 2: kubeconfig ファイルを作成するについて、整理します。ステップ2では以下の2つのkubeconfig ファイルの作成方法が紹介されています。

  • AWS CLIを利用する方法
  • 手作業で設定する方法

AWS CLIを利用する方法

AWS CLIを利用する方法の場合、「eksctlの開始方法」 の場合と同じように、AWS CLIがAssume Roleを利用して作業対象アカウントへアクセスするようにします。
こちらの手順でAWS CLIの設定を完了後、AWS CLI の update-kubeconfig コマンド実行時にAssume Roleを利用するプロファイルを使用するようにします。前述の通り、--p optionでプロファイルを指定するか、環境変数で利用するプロファイルを指定することができます。

optionでプロファイルを指定する場合
aws eks --region <region> update-kubeconfig --name <cluster_name> --p assume
環境変数でプロファイルを指定する場合
export AWS_PROFILE=assume
aws eks --region <region> update-kubeconfig --name <cluster_name> ## --pの指定は不要になります

手作業で設定する方法

こちら の「kubeconfig ファイルを手動で作成するには」で紹介されている方法の場合、紹介されているkubeconfigのコードブロックでコメントアウトされている設定を利用することで実現できます。ここではaws eks get-tokenを利用する場合のコードブロックを例にご紹介します。

apiVersion: v1
clusters:
- cluster:
    server: <endpoint-url>
    certificate-authority-data: <base64-encoded-ca-cert>
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: aws
  name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: aws
      args:
        - "eks"
        - "get-token"
        - "--cluster-name"
        - "<cluster-name>"
        - "--role"
        - "<作業対象アカウントのRoleのarnを記載>"
      env:
        - name: AWS_PROFILE
          value: "<上記のroleにAssume Roleできるプロファイルを指定>"

users.user.argsの --role に作業対象アカウントのRoleのarnを設定します。
また、users.user.envに AWS_PROFILEを設定することで、利用するプロファイルを指定することもできますので、defaultのプロファイルが作業対象アカウントのRoleにアクセスできないときや、「eksctlの開始方法」 の場合の手順でAssumr Roleするプロファイルを事前に設定した場合は、こちらを指定することで、プロファイルを切り替えて、EKSのクラスタにアクセスできます。
AWS CLIの設定ごとの各設定項目については下記にまとめます。

AWS CLIの設定 users.user.argsの --role users.user.envのAWS_PROFILE
defaultのプロファイルがAssume Role可能 必要 不要
defaultのプロファイルがAssume Role不可 必要 Assume Roleできるプロファイルを指定する
~/.aws/config でAssume Roleするプロファイルを設定している 不要 設定したプロファイルを指定

最後に

AWS CLIやEKSを使い慣れている人には当たり前のことかと思いますが、AWSの経験がまだ少ない方で、EKSの利用を検討されている方がスムーズに検証を開始する一助になるかと思いまとめてみました。

内容については動作検証もしておりますが間違いなどお気付きの点ありましたらぜひ教えてください。
また、もっと簡単にやれる方法あるよ!などありましたらぜひご指摘ください。

なお、近しいお話として、MFAを利用した認証を利用したい場合は下記もご参照ください。
https://github.com/toricls/eks-kubectl-mfa-helper

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

個人開発向けAWSアカウント作成RTA(ver2019)

これ何

  • お正月にGolangやらで遊ぼうとしたら、個人用AWSアカウントを解約してたの忘れてて、新たに作り直す必要が発生した。
  • Tips自体は色々落ちてるが、以下の気持ちになり自分用の手順をまとめたくなった。
    • 個人の責任の範囲内で、要点は抑えつつミニマムな設定で始めたい。
    • 網羅感がないTips群≒都度ググる必要あり
    • 逆に網羅性のある記事はテキスト量が多く読むのがつらい。
  • 基本的には利用経験、アカウント開設経験ありの人向けの覚書とする。
  • 全然RTAじゃないけど許して

0.アカウント開設~rootアカウントでのログイン

略。
公式UIがよく変わる都合上、作る度に地味にハマるのはご愛敬。

1.rootアカウントでやること

1-1. rootアカウントのMFA設定

  • IAM画面から、MFA設定を行う
    • 最悪これはやらないと怖くて眠れない

1-2. Admin権限のIAMユーザ作成

  • 自分用IAMユーザ(Admin)の作成
    • Administrator Accessを直接 or グループを作成してアタッチ。
      • ベストプラクティスは後者だが、私用なら前者で十分。
  • IAMユーザのMFA設定
    • IAMユーザを選択して、認証情報→MFA デバイスの割り当て

1-3. 請求周り

  • IAM アクセスのアクティブ化
    • コンソール右上のアカウント名→「マイアカウント」→「IAM ユーザー/ロールによる請求情報へのアクセス」
    • これやらないと費用が気になる度にrootアカウントで入り直さなくなるので、個人向けでもやった方が良いです。
  • 円払いへの切り替え
    • 同じく「マイアカウント」から「お支払い方法」→「お支払通貨の設定」でJPYに変更
    • デフォのドル払いだと外貨取扱手数料(ググると1.63%くらい?)取られるので大切。

1-4. サポートレベル変更

  • AWS側の障害について問い合わせたい時は開発者サポート\$29/月, 回答早く欲しい場合はビジネス\$100/月
    • 趣味の開発環境が欲しいだけなので私はパス。

2.IAMユーザでやること

0. コンソールログイン(with MFA)

  • ログインできたら、あとはrootアカウントは解約まで封印できるはず

1.コスト管理

  • budgetsで請求アラートを設定。
    • 週・日の単位で通知が欲しい場合は別途Lambdaなどで作りこみ。
    • 以下は100円以下で運用したい人の例
ステップ 設定 覚書
1 予算タイプの選択 コスト予算 - -
2 予算の設定 間隔 月別 最小の間隔。
2 予算の設定 予算額 $1 自身が許容できる額の最小。
3 アラートの設定 アラートのしきい値 予算の80% Defaultのまま
3 アラートの設定 連絡電子メール ※メアド アクティブに使うアドレスで(知らないうちに破産するので)

2.監査用の御三家

CloudTrail

  • 手順は一番楽そうなものを。
    • CloudTrailを全リージョン有効化
    • CloudTrail のデータイベントを有効化。S3のPUT,GET、Lambdaの色々を拾う
      • S3,Lambda周りでデバッグしたい人は。
      • 別途費用かかるのでとりあえずパス
    • CloudTrail Insightsを有効化
      • お金かかるので、私はGuardDutyに任せます。

GuardDuty

※ 個人アカウント利用での予算感が分かっていないので、一月様子を見た後、別途更新予定。

Config

  • 個人用アカウントなので、とりあえず有効化をゴールとする。
ステップ 設定 覚書
1 テンプレートの選択 前提条件 - テンプレートの準備 サンプルテンプレートを使用 -
1 テンプレートの選択 サンプルテンプレートの選択 AWS Configの有効化 -
2 スタックの詳細を指定 NotificationEmail <自分のメアド> -

3.fin.

これであとは自由だ。
Cloud9建てて好きなことして遊びましょう。

RTA的な振り返り

  • CloudTrail, GuardDutyもStackSetsのテンプレートにあるので、それで十分かも(やってて気づいた)
  • SNSトピックのConfirmはStackSetのスキマ時間で実施しよう。
  • 結局記事書きながら作ってたので時間測れてない(笑) 30~長くても60分あればいけるかな。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

個人開発向けAWSアカウント作成RTA(2019ver)

これ何

  • お正月にGolangやらで遊ぼうとしたら、個人用AWSアカウントを解約してたの忘れてて、新たに作り直す必要が発生した。
  • Tips自体は色々落ちてるが、以下の気持ちになり自分用の手順をまとめたくなった。
    • 個人の責任の範囲内で、要点は抑えつつミニマムな設定で始めたい。
    • 網羅感がないTips群≒都度ググる必要あり
    • 逆に網羅性のある記事はテキスト量が多く読むのがつらい。
  • 基本的には利用経験、アカウント開設経験ありの人向けの覚書とする。
  • 全然RTAじゃないけど許して

0.アカウント開設~rootアカウントでのログイン

略。
公式UIがよく変わる都合上、作る度に地味にハマるのはご愛敬。

1.rootアカウントでやること

1-1. rootアカウントのMFA設定

  • IAM画面から、MFA設定を行う
    • 最悪これはやらないと怖くて眠れない

1-2. Admin権限のIAMユーザ作成

  • 自分用IAMユーザ(Admin)の作成
    • Administrator Accessを直接 or グループを作成してアタッチ。
      • ベストプラクティスは後者だが、私用なら前者で十分。
  • IAMユーザのMFA設定
    • IAMユーザを選択して、認証情報→MFA デバイスの割り当て

1-3. 請求周り

  • IAM アクセスのアクティブ化
    • コンソール右上のアカウント名→「マイアカウント」→「IAM ユーザー/ロールによる請求情報へのアクセス」
    • これやらないと費用が気になる度にrootアカウントで入り直すことになるので、個人向けでもやった方が良いです。
  • 円払いへの切り替え
    • 同じく「マイアカウント」から「お支払い方法」→「お支払通貨の設定」でJPYに変更
    • デフォのドル払いだと外貨取扱手数料(ググると1.63%くらい?)取られるのでかなり大切。

1-4. サポートレベル変更

  • AWS側の障害について問い合わせたい時は開発者サポート\$29/月, 回答早く欲しい場合はビジネス\$100/月
    • 趣味の開発環境が欲しいだけなので私はパス。

2.IAMユーザでやること

0. コンソールログイン(with MFA)

  • ログインできたら、あとはrootアカウントは解約まで封印できるはず

1.コスト管理

  • budgetsで請求アラートを設定。
    • 週・日の単位で通知が欲しい場合は別途Lambdaなどで作りこみ。
    • 以下は100円以下で運用したい人の例
ステップ 設定 覚書
1 予算タイプの選択 コスト予算 - -
2 予算の設定 間隔 月別 最小の間隔。
2 予算の設定 予算額 $1 自身が許容できる額の最小。
3 アラートの設定 アラートのしきい値 予算の80% Defaultのまま
3 アラートの設定 連絡電子メール ※メアド アクティブに使うアドレスで(知らないうちに破産するので)

2.監査用の御三家

CloudTrail

  • 手順は一番楽そうなものを。
    • CloudTrailを全リージョン有効化
    • CloudTrail のデータイベントを有効化。S3のPUT,GET、Lambdaの色々を拾う
      • S3,Lambda周りでデバッグしたい人は。
      • 別途費用かかるのでとりあえずパス
    • CloudTrail Insightsを有効化
      • お金かかるので、私はGuardDutyに任せます。

GuardDuty

※ 個人アカウント利用での予算感が分かっていないので、一月様子を見た後、別途更新予定。

Config

  • 個人用アカウントなので、とりあえず有効化をゴールとする。
ステップ 設定 覚書
1 テンプレートの選択 前提条件 - テンプレートの準備 サンプルテンプレートを使用 -
1 テンプレートの選択 サンプルテンプレートの選択 AWS Configの有効化 -
2 スタックの詳細を指定 NotificationEmail <自分のメアド> -

3.fin.

これであとは自由だ。
Cloud9建てて好きなことして遊びましょう。

RTA的な振り返り

  • CloudTrail, GuardDutyもStackSetsのテンプレートにあるので、それで十分かも(やってて気づいた)
  • SNSトピックのConfirmはStackSetのスキマ時間で実施しよう。
  • 結局記事書きながら作ってたので時間測れてない(笑) 30~長くても60分あればいけるかな。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

awsのセキュリティグループでipアドレスやポートの設定を一括で行う方法

awsの操作をUIだけで進めようとすると、情報の入力に時間がかかってしまうときがありますよね!

最近では、セキュリティグループを作成しようとした時、「めんどくさい!」って思っちゃいました。
そこで、コマンド駆使して、ミス無く登録が行えたので、ここにメモして置こうと思います

具体的に使ったコマンドの解説

下記が具体的に使ったコマンドです。

このコマンドを実行する前に、下記の準備をする必要があります。

  1. ルールが空のセキュリティグループ
  2. 作ったセキュリティグループのID

このグループIDを元に、セキュリティグループを作っていきます。

使うこまんコマンドは下記のようになります。

$ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 104.154.0.0/15

もし、複数回実行されても、すでに登録されているものも旨が表示されるので安心です。

使ったコマンド一覧

1つ1つのコマンドは動作が遅いので、最後に&をつけて並列化させています。自分の環境では、40ぐらいずつ処理していくのがスムーズでした。

aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 104.154.0.0/15 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 104.196.0.0/14 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 107.167.160.0/19 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 107.178.192.0/18 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 108.170.192.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 108.170.208.0/21 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 108.170.216.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 108.170.220.0/23 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 108.170.222.0/24 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 108.59.80.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 130.211.128.0/17 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 130.211.16.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 130.211.32.0/19 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 130.211.4.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 130.211.64.0/18 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 130.211.8.0/21 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 146.148.16.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 146.148.2.0/23 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 146.148.32.0/19 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 146.148.4.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 146.148.64.0/18 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 146.148.8.0/21 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 162.216.148.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 162.222.176.0/21 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 173.255.112.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 192.158.28.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 199.192.112.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 199.223.232.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 199.223.236.0/23 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 208.68.108.0/23 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 23.236.48.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 23.251.128.0/19 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.100.0.0/16 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.102.0.0/15 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.104.0.0/14 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.124.0.0/18 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.124.64.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.124.80.0/23 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.124.84.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.124.88.0/23 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.124.92.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.125.0.0/16 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.64.0.0/11 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 34.96.0.0/14 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 35.184.0.0/14 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 35.188.0.0/15 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 35.190.0.0/17 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 35.190.128.0/18 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 35.190.192.0/19 &
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxf9c46a8686 --protocol tcp --port 3306 --cidr 35.190.224.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.190.240.0/22 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.192.0.0/14 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.196.0.0/15 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.198.0.0/16 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.199.0.0/17 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.199.128.0/18 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.200.0.0/13 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.208.0.0/13 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.216.0.0/15 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.219.192.0/24 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.220.0.0/14 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.224.0.0/13 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.232.0.0/15 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.234.0.0/16 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.235.0.0/17 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.235.192.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.235.216.0/21 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.235.224.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.236.0.0/14 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 35.240.0.0/13 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 8.34.208.0/20 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 8.35.192.0/21 &
aws ec2 authorize-security-group-ingress --group-id sg-0xxxxxxa9d1e969ae --protocol tcp --port 3306 --cidr 8.35.200.0/23 &
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Workspacesにまつわる話

概要

Workspaces 固定IP(Elastic IP) 割り当て
Workspaces 自動バックアップ

利用技術

  • AWS Workspaces
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS上に導入したOpenShiftを削除する

はじめに

こちらで構築し、こちらでノードを拡張したAWS上のOpenShiftを削除した際の情報です。

削除実行

OpenShiftのインストーラーのdestloyオプションをつけたopenshift-install destroy clusterを実行し、OpenShiftクラスターを削除します。(おまけで、dateコマンドで実行時間を測ってみました)
参考:1.5. AWS でのクラスターのアンインストール

$ date; ./openshift-install destroy cluster; date
Fri Dec 27 15:53:05 JST 2019
INFO Disassociated                                 instance=i-06040dc85dd9592fc name=ocp4-aws-qt9tx-worker-profile role=ocp4-aws-qt9tx-worker-role
INFO Deleted                                       InstanceProfileName=ocp4-aws-qt9tx-worker-profile arn="arn:aws:iam::771205398267:instance-profile/ocp4-aws-qt9tx-worker-profile" instance=i-06040dc85dd9592fc
INFO Terminating                                   instance=i-06040dc85dd9592fc
INFO Disassociated                                 instance=i-0803a574bb5dcf187 name=ocp4-aws-qt9tx-master-profile role=ocp4-aws-qt9tx-master-role
INFO Deleted                                       InstanceProfileName=ocp4-aws-qt9tx-master-profile arn="arn:aws:iam::771205398267:instance-profile/ocp4-aws-qt9tx-master-profile" instance=i-0803a574bb5dcf187
INFO Terminating                                   instance=i-0803a574bb5dcf187
INFO Terminating                                   instance=i-012eff808ea3842da
INFO Terminating                                   instance=i-065bc63aa80a65978
INFO Terminating                                   instance=i-0f42eefbd8db37e95
INFO Terminating                                   instance=i-012889902c4ae4ef1
INFO Terminating                                   instance=i-0a47cfbff48b4e0b0
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-02e1e4e19f18b8611" id=rtbassoc-01dc9cba49464f04f
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-02e1e4e19f18b8611" id=rtbassoc-0168b2255307b23bd
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-02e1e4e19f18b8611" id=rtbassoc-06b47701ae08fc2b3
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-02e1e4e19f18b8611" id=rtbassoc-0bda01b42df9b8e63
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-02e1e4e19f18b8611" id=rtbassoc-08f3ab4e97aeeb3ab
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-02e1e4e19f18b8611" id=rtbassoc-0609a60b123b88255
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-0ea4524ccf029f28f" id=rtbassoc-05f318266b1ade8ea
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-0ea4524ccf029f28f" id=rtb-0ea4524ccf029f28f
INFO Deleted                                       arn="arn:aws:s3:::ocp4-aws-qt9tx-image-registry-us-east-1-nkwcrevfniclclcsemiohe"
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:natgateway/nat-040ad819ac587f213" id=nat-040ad819ac587f213
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" classic load balancer=a62dfbe6327ed11ea8c801259770d53d id=vpc-01492d360c1c2b78c
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c load balancer=loadbalancer/net/ocp4-aws-qt9tx-ext/3f30b09520360596
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c load balancer=loadbalancer/net/ocp4-aws-qt9tx-int/f33eacc835a42193
INFO Deleted                                       NAT gateway=nat-03fccbb7ed2ff88d7 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-04281cedb1ab54337 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-0445b59e3d0acd857 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-040ad819ac587f213 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-0757f4759e227f2ba arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-019bb4873d2ce3d37 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:natgateway/nat-0445b59e3d0acd857" id=nat-0445b59e3d0acd857
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-0903aae972cfd8646" id=rtbassoc-00af4ae18370a5cf0
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-0903aae972cfd8646" id=rtb-0903aae972cfd8646
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-097fc2e09db9bfcb0" id=rtbassoc-09791dd659204a790
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-097fc2e09db9bfcb0" id=rtb-097fc2e09db9bfcb0
INFO Deleted                                       arn="arn:aws:elasticloadbalancing:us-east-1:771205398267:loadbalancer/net/ocp4-aws-qt9tx-ext/3f30b09520360596" id=net/ocp4-aws-qt9tx-ext/3f30b09520360596
INFO Deleted                                       arn="arn:aws:elasticloadbalancing:us-east-1:771205398267:targetgroup/ocp4-aws-qt9tx-aint/077c731b1242ca95" id=ocp4-aws-qt9tx-aint/077c731b1242ca95
INFO Deleted                                       arn="arn:aws:elasticloadbalancing:us-east-1:771205398267:targetgroup/ocp4-aws-qt9tx-sint/cfbfe86104a8d329" id=ocp4-aws-qt9tx-sint/cfbfe86104a8d329
INFO Deleted                                       arn="arn:aws:elasticloadbalancing:us-east-1:771205398267:targetgroup/ocp4-aws-qt9tx-aext/ed1c99f0f74420dc" id=ocp4-aws-qt9tx-aext/ed1c99f0f74420dc
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-0f901451df5c8434c" id=rtbassoc-0e38054ada7b07f29
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-0f901451df5c8434c" id=rtb-0f901451df5c8434c
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:security-group/sg-03c4806a31ed92087" id=sg-03c4806a31ed92087
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:image/ami-00cc71894642d7665" id=ami-00cc71894642d7665
INFO Deleted                                       arn="arn:aws:elasticloadbalancing:us-east-1:771205398267:loadbalancer/a62dfbe6327ed11ea8c801259770d53d" id=a62dfbe6327ed11ea8c801259770d53d
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-0ad9db016c511a942" id=rtbassoc-04e9c7e660ca1d7c8
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-0ad9db016c511a942" id=rtb-0ad9db016c511a942
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:subnet/subnet-0083d4bbcc874c817" id=subnet-0083d4bbcc874c817
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:natgateway/nat-03fccbb7ed2ff88d7" id=nat-03fccbb7ed2ff88d7
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:natgateway/nat-04281cedb1ab54337" id=nat-04281cedb1ab54337
INFO Disassociated                                 arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-018223da4cf37dab1" id=rtbassoc-08af490fd7573a0bf
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:route-table/rtb-018223da4cf37dab1" id=rtb-018223da4cf37dab1
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ record set="SRV _etcd-server-ssl._tcp.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ record set="A api-int.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ public zone=/hostedzone/Z3E4ARDG6RG5M record set="A api.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ record set="A api.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ public zone=/hostedzone/Z3E4ARDG6RG5M record set="A \\052.apps.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ record set="A \\052.apps.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ record set="A etcd-0.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ record set="A etcd-1.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ record set="A etcd-2.ocp4-aws.iseocp2019.net."
INFO Deleted                                       arn="arn:aws:route53:::hostedzone/Z03959811O3E58RT0IIXQ" id=Z03959811O3E58RT0IIXQ
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:natgateway/nat-019bb4873d2ce3d37" id=nat-019bb4873d2ce3d37
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:natgateway/nat-0757f4759e227f2ba" id=nat-0757f4759e227f2ba
INFO Released                                      arn="arn:aws:ec2:us-east-1:771205398267:elastic-ip/eipalloc-0aec069ffdef268e1" id=eipalloc-0aec069ffdef268e1
INFO Deleted                                       arn="arn:aws:iam::771205398267:role/ocp4-aws-qt9tx-master-role" id=ocp4-aws-qt9tx-master-role name=ocp4-aws-qt9tx-master-role policy=ocp4-aws-qt9tx-master-policy
INFO Deleted                                       arn="arn:aws:iam::771205398267:role/ocp4-aws-qt9tx-master-role" id=ocp4-aws-qt9tx-master-role name=ocp4-aws-qt9tx-master-role
INFO Deleted                                       arn="arn:aws:iam::771205398267:role/ocp4-aws-qt9tx-worker-role" id=ocp4-aws-qt9tx-worker-role name=ocp4-aws-qt9tx-worker-role policy=ocp4-aws-qt9tx-worker-policy
INFO Deleted                                       arn="arn:aws:iam::771205398267:role/ocp4-aws-qt9tx-worker-role" id=ocp4-aws-qt9tx-worker-role name=ocp4-aws-qt9tx-worker-role
INFO Deleted                                       arn="arn:aws:iam::771205398267:user/ocp4-aws-qt9tx-cloud-credential-operator-iam-ro-m4l4k" id=ocp4-aws-qt9tx-cloud-credential-operator-iam-ro-m4l4k policy=ocp4-aws-qt9tx-cloud-credential-operator-iam-ro-m4l4k-policy
INFO Deleted                                       arn="arn:aws:iam::771205398267:user/ocp4-aws-qt9tx-cloud-credential-operator-iam-ro-m4l4k" id=ocp4-aws-qt9tx-cloud-credential-operator-iam-ro-m4l4k
INFO Deleted                                       arn="arn:aws:iam::771205398267:user/ocp4-aws-qt9tx-openshift-image-registry-g94jm" id=ocp4-aws-qt9tx-openshift-image-registry-g94jm policy=ocp4-aws-qt9tx-openshift-image-registry-g94jm-policy
INFO Deleted                                       arn="arn:aws:iam::771205398267:user/ocp4-aws-qt9tx-openshift-image-registry-g94jm" id=ocp4-aws-qt9tx-openshift-image-registry-g94jm
INFO Deleted                                       arn="arn:aws:iam::771205398267:user/ocp4-aws-qt9tx-openshift-ingress-gfzt9" id=ocp4-aws-qt9tx-openshift-ingress-gfzt9 policy=ocp4-aws-qt9tx-openshift-ingress-gfzt9-policy
INFO Deleted                                       arn="arn:aws:iam::771205398267:user/ocp4-aws-qt9tx-openshift-ingress-gfzt9" id=ocp4-aws-qt9tx-openshift-ingress-gfzt9
INFO Deleted                                       arn="arn:aws:iam::771205398267:user/ocp4-aws-qt9tx-openshift-machine-api-aws-xvn86" id=ocp4-aws-qt9tx-openshift-machine-api-aws-xvn86 policy=ocp4-aws-qt9tx-openshift-machine-api-aws-xvn86-policy
INFO Deleted                                       arn="arn:aws:iam::771205398267:user/ocp4-aws-qt9tx-openshift-machine-api-aws-xvn86" id=ocp4-aws-qt9tx-openshift-machine-api-aws-xvn86
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:subnet/subnet-0dfc8d949f581b3a4" id=subnet-0dfc8d949f581b3a4
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:subnet/subnet-0b99c81485fc8cf27" id=subnet-0b99c81485fc8cf27
INFO Released                                      arn="arn:aws:ec2:us-east-1:771205398267:elastic-ip/eipalloc-00abdc6b46a5f59e7" id=eipalloc-00abdc6b46a5f59e7
INFO Released                                      arn="arn:aws:ec2:us-east-1:771205398267:elastic-ip/eipalloc-056562cbcb2d980b4" id=eipalloc-056562cbcb2d980b4
INFO Released                                      arn="arn:aws:ec2:us-east-1:771205398267:elastic-ip/eipalloc-0880b2ef3d5601cb8" id=eipalloc-0880b2ef3d5601cb8
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:subnet/subnet-09e8583dcedb0ffd0" id=subnet-09e8583dcedb0ffd0
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:subnet/subnet-08a07bd03ca99d986" id=subnet-08a07bd03ca99d986
INFO Deleted                                       NAT gateway=nat-03fccbb7ed2ff88d7 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-04281cedb1ab54337 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-0445b59e3d0acd857 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-040ad819ac587f213 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-0757f4759e227f2ba arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-019bb4873d2ce3d37 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c network interface=eni-0915373cbb9dd01a9
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c network interface=eni-0e528020924db9c37
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c network interface=eni-07bba9f8f6e1bc331
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c table=rtb-0f607db5dcf2133e8
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c security group=sg-035be00242538d9cc
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c security group=sg-04d1f4bb8b4e29025
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c subnet=subnet-01a083e332e19a16c
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c subnet=subnet-003e12c62103f5337
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c subnet=subnet-05b743070159bb2ee
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c subnet=subnet-05c1de071974f5ab5
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c subnet=subnet-01280008eb65adc72
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c subnet=subnet-0cce0b7ee560b45f3
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c subnet=subnet-00516b38f815ad971
INFO Deleted                                       VPC endpoint=vpce-0293993c2b9171bde arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:internet-gateway/igw-0fedca7c9d644922d" id=igw-0fedca7c9d644922d
INFO Released                                      arn="arn:aws:ec2:us-east-1:771205398267:elastic-ip/eipalloc-03006a2c1cd1dcd9e" id=eipalloc-03006a2c1cd1dcd9e
INFO Released                                      arn="arn:aws:ec2:us-east-1:771205398267:elastic-ip/eipalloc-0eda61b7a2fbb29e9" id=eipalloc-0eda61b7a2fbb29e9
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:snapshot/snap-063e4bb2a68b2e702" id=snap-063e4bb2a68b2e702
INFO Deleted                                       NAT gateway=nat-03fccbb7ed2ff88d7 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-04281cedb1ab54337 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-0445b59e3d0acd857 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-040ad819ac587f213 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-0757f4759e227f2ba arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       NAT gateway=nat-019bb4873d2ce3d37 arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:vpc/vpc-01492d360c1c2b78c" id=vpc-01492d360c1c2b78c
INFO Deleted                                       arn="arn:aws:ec2:us-east-1:771205398267:dhcp-options/dopt-08828cc5fb0ecd133" id=dopt-08828cc5fb0ecd133
Fri Dec 27 15:57:58 JST 2019

まとめ

5分弱で今回構築したAWS上のOpenShift環境が削除されました。AWSのリソースはすべて綺麗サッパリ削除されていました。
今回workerノードを追加していましたが、一緒に削除されています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS上に導入したOpenShiftのworkerノード拡張

はじめに

AWS上にOpenShiftを簡単に導入でき、その結果できあがるAWSリソースの一覧は”OpenShiftをAWSに導入するための見積もりに必要な情報”で示した通りです。
その後もう少しいじってみたい!ということで、今回はworkerノードを追加した結果を記載します。

環境情報

OpenShiftインストーラー: openshift-client-linux-4.2.12.tar.gz
作業端末:Windows10 Subsystem for Linux(Ubuntu:VERSION=16.04.3 LTS)にAWSCLI導入済
AWS:バージニア北部リージョン(us-east-1)
OpenShift環境:こちらでインストールした環境

ノード追加

初期構成

  • Node
$ ./oc get nodes
NAME                           STATUS   ROLES    AGE   VERSION
ip-10-0-131-148.ec2.internal   Ready    worker   15h   v1.14.6+cebabbf4a
ip-10-0-135-200.ec2.internal   Ready    master   15h   v1.14.6+cebabbf4a
ip-10-0-144-36.ec2.internal    Ready    master   15h   v1.14.6+cebabbf4a
ip-10-0-155-190.ec2.internal   Ready    worker   15h   v1.14.6+cebabbf4a
ip-10-0-162-16.ec2.internal    Ready    worker   15h   v1.14.6+cebabbf4a
ip-10-0-173-76.ec2.internal    Ready    master   15h   v1.14.6+cebabbf4a
  • Machine

ノードのホストを記述する基本的なユニットです。

$ ./oc get machine -n openshift-machine-api
NAME                                     STATE     TYPE        REGION      ZONE         AGE
ocp4-aws-qt9tx-master-0                  running   m4.xlarge   us-east-1   us-east-1a   15h
ocp4-aws-qt9tx-master-1                  running   m4.xlarge   us-east-1   us-east-1b   15h
ocp4-aws-qt9tx-master-2                  running   m4.xlarge   us-east-1   us-east-1c   15h
ocp4-aws-qt9tx-worker-us-east-1a-vmjz4   running   m4.large    us-east-1   us-east-1a   15h
ocp4-aws-qt9tx-worker-us-east-1b-5txwz   running   m4.large    us-east-1   us-east-1b   15h
ocp4-aws-qt9tx-worker-us-east-1c-4h8zq   running   m4.large    us-east-1   us-east-1c   15h
  • Machineset

マシンのグループです。MachineSet とマシンの関係は、ReplicaSet と Pod の関係と同様です。

$ ./oc get machinesets -n openshift-machine-api
NAME                               DESIRED   CURRENT   READY   AVAILABLE   AGE
ocp4-aws-qt9tx-worker-us-east-1a   1         1         1       1           15h
ocp4-aws-qt9tx-worker-us-east-1b   1         1         1       1           15h
ocp4-aws-qt9tx-worker-us-east-1c   1         1         1       1           15h
ocp4-aws-qt9tx-worker-us-east-1d   0         0                             15h
ocp4-aws-qt9tx-worker-us-east-1e   0         0                             15h
ocp4-aws-qt9tx-worker-us-east-1f   0         0                             15h
  • workerノードの追加対象Machineset(ocp4-aws-qt9tx-worker-us-east-1d)詳細

マシンを追加する必要がある場合や、マシンの数を縮小したりする必要がある場合、コンピューティングのニーズに応じて MachineSet の replicas フィールドを変更します。
今回はまだworkerノードが設定・起動していないMachineset ocp4-aws-qt9tx-worker-us-east-1d からworkerノードを追加することにします。

ocp4-aws-qt9tx-worker-us-east-1d
$ ./oc get machinesets -n openshift-machine-api ocp4-aws-qt9tx-worker-us-east-1d -o yaml
apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  creationTimestamp: "2019-12-26T14:27:57Z"
  generation: 1
  labels:
    machine.openshift.io/cluster-api-cluster: ocp4-aws-qt9tx
  name: ocp4-aws-qt9tx-worker-us-east-1d
  namespace: openshift-machine-api
  resourceVersion: "3314"
  selfLink: /apis/machine.openshift.io/v1beta1/namespaces/openshift-machine-api/machinesets/ocp4-aws-qt9tx-worker-us-east-1d
  uid: e9998df3-27eb-11ea-a1e1-1285990f1d61
spec:
  replicas: 0
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: ocp4-aws-qt9tx
      machine.openshift.io/cluster-api-machineset: ocp4-aws-qt9tx-worker-us-east-1d
  template:
    metadata:
      creationTimestamp: null
      labels:
        machine.openshift.io/cluster-api-cluster: ocp4-aws-qt9tx
        machine.openshift.io/cluster-api-machine-role: worker
        machine.openshift.io/cluster-api-machine-type: worker
        machine.openshift.io/cluster-api-machineset: ocp4-aws-qt9tx-worker-us-east-1d
    spec:
      metadata:
        creationTimestamp: null
      providerSpec:
        value:
          ami:
            id: ami-01e7fdcb66157b224
          apiVersion: awsproviderconfig.openshift.io/v1beta1
          blockDevices:
          - ebs:
              iops: 0
              volumeSize: 120
              volumeType: gp2
          credentialsSecret:
            name: aws-cloud-credentials
          deviceIndex: 0
          iamInstanceProfile:
            id: ocp4-aws-qt9tx-worker-profile
          instanceType: m4.large
          kind: AWSMachineProviderConfig
          metadata:
            creationTimestamp: null
          placement:
            availabilityZone: us-east-1d
            region: us-east-1
          publicIp: null
          securityGroups:
          - filters:
            - name: tag:Name
              values:
              - ocp4-aws-qt9tx-worker-sg
          subnet:
            filters:
            - name: tag:Name
              values:
              - ocp4-aws-qt9tx-private-us-east-1d
          tags:
          - name: kubernetes.io/cluster/ocp4-aws-qt9tx
            value: owned
          userDataSecret:
            name: worker-user-data
status:
  observedGeneration: 1
  replicas: 0

上記replicas: 0の数値をコマンドもしくは直接編集することでworkerノードが追加されます。

設定変更

oc scaleコマンドを使ってworkerノードを追加(スケール)します。
参考:2.1. MachineSet の手動によるスケーリング

$ ./oc scale machinesets ocp4-aws-qt9tx-worker-us-east-1d --replicas=1 -n openshift-machine-api
machineset.machine.openshift.io/ocp4-aws-qt9tx-worker-us-east-1d scaled

設定変更後

  • イベント確認
$ ./oc get event -n openshift-machine-api
LAST SEEN   TYPE     REASON    OBJECT                                           MESSAGE
9m29s       Normal   Updated   machine/ocp4-aws-qt9tx-master-0                  Updated machine ocp4-aws-qt9tx-master-0
9m32s       Normal   Updated   machine/ocp4-aws-qt9tx-master-1                  Updated machine ocp4-aws-qt9tx-master-1
9m31s       Normal   Updated   machine/ocp4-aws-qt9tx-master-2                  Updated machine ocp4-aws-qt9tx-master-2
9m30s       Normal   Updated   machine/ocp4-aws-qt9tx-worker-us-east-1a-vmjz4   Updated machine ocp4-aws-qt9tx-worker-us-east-1a-vmjz4
9m30s       Normal   Updated   machine/ocp4-aws-qt9tx-worker-us-east-1b-5txwz   Updated machine ocp4-aws-qt9tx-worker-us-east-1b-5txwz
9m30s       Normal   Updated   machine/ocp4-aws-qt9tx-worker-us-east-1c-4h8zq   Updated machine ocp4-aws-qt9tx-worker-us-east-1c-4h8zq
5m42s       Normal   Created   machine/ocp4-aws-qt9tx-worker-us-east-1d-64l7m   Created Machine ocp4-aws-qt9tx-worker-us-east-1d-64l7m
81s         Normal   Updated   machine/ocp4-aws-qt9tx-worker-us-east-1d-64l7m   Updated machine ocp4-aws-qt9tx-worker-us-east-1d-64l7m
  • Machine確認
$ ./oc get machine -n openshift-machine-api
NAME                                     STATE     TYPE        REGION      ZONE         AGE
ocp4-aws-qt9tx-master-0                  running   m4.xlarge   us-east-1   us-east-1a   15h
ocp4-aws-qt9tx-master-1                  running   m4.xlarge   us-east-1   us-east-1b   15h
ocp4-aws-qt9tx-master-2                  running   m4.xlarge   us-east-1   us-east-1c   15h
ocp4-aws-qt9tx-worker-us-east-1a-vmjz4   running   m4.large    us-east-1   us-east-1a   15h
ocp4-aws-qt9tx-worker-us-east-1b-5txwz   running   m4.large    us-east-1   us-east-1b   15h
ocp4-aws-qt9tx-worker-us-east-1c-4h8zq   running   m4.large    us-east-1   us-east-1c   15h
ocp4-aws-qt9tx-worker-us-east-1d-64l7m   running   m4.large    us-east-1   us-east-1d   6m14s
  • Machineset確認
$ ./oc get machinesets -n openshift-machine-api
NAME                               DESIRED   CURRENT   READY   AVAILABLE   AGE
ocp4-aws-qt9tx-worker-us-east-1a   1         1         1       1           15h
ocp4-aws-qt9tx-worker-us-east-1b   1         1         1       1           15h
ocp4-aws-qt9tx-worker-us-east-1c   1         1         1       1           15h
ocp4-aws-qt9tx-worker-us-east-1d   1         1         1       1           15h
ocp4-aws-qt9tx-worker-us-east-1e   0         0                             15h
ocp4-aws-qt9tx-worker-us-east-1f   0         0                             15h
  • Node確認
$ ./oc get nodes
NAME                           STATUS   ROLES    AGE    VERSION
ip-10-0-131-148.ec2.internal   Ready    worker   15h    v1.14.6+cebabbf4a
ip-10-0-135-200.ec2.internal   Ready    master   15h    v1.14.6+cebabbf4a
ip-10-0-144-36.ec2.internal    Ready    master   15h    v1.14.6+cebabbf4a
ip-10-0-155-190.ec2.internal   Ready    worker   15h    v1.14.6+cebabbf4a
ip-10-0-162-16.ec2.internal    Ready    worker   15h    v1.14.6+cebabbf4a
ip-10-0-173-76.ec2.internal    Ready    master   15h    v1.14.6+cebabbf4a
ip-10-0-191-196.ec2.internal   Ready    worker   2m7s   v1.14.6+cebabbf4a
  • AWSのリソース

image.png

一番下のocp4-aws-qt9x-worker-us-east-1d-64l7mがoc scaleコマンドにより自動で追加されたEC2。

詳細情報

  • workerノードを追加したMachineset(ocp4-aws-qt9tx-worker-us-east-1d)詳細
ocp4-aws-qt9tx-worker-us-east-1d
$ ./oc get machinesets -n openshift-machine-api ocp4-aws-qt9tx-worker-us-east-1d -o yaml
apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  creationTimestamp: "2019-12-26T14:27:57Z"
  generation: 2
  labels:
    machine.openshift.io/cluster-api-cluster: ocp4-aws-qt9tx
  name: ocp4-aws-qt9tx-worker-us-east-1d
  namespace: openshift-machine-api
  resourceVersion: "296242"
  selfLink: /apis/machine.openshift.io/v1beta1/namespaces/openshift-machine-api/machinesets/ocp4-aws-qt9tx-worker-us-east-1d
  uid: e9998df3-27eb-11ea-a1e1-1285990f1d61
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: ocp4-aws-qt9tx
      machine.openshift.io/cluster-api-machineset: ocp4-aws-qt9tx-worker-us-east-1d
  template:
    metadata:
      creationTimestamp: null
      labels:
        machine.openshift.io/cluster-api-cluster: ocp4-aws-qt9tx
        machine.openshift.io/cluster-api-machine-role: worker
        machine.openshift.io/cluster-api-machine-type: worker
        machine.openshift.io/cluster-api-machineset: ocp4-aws-qt9tx-worker-us-east-1d
    spec:
      metadata:
        creationTimestamp: null
      providerSpec:
        value:
          ami:
            id: ami-01e7fdcb66157b224
          apiVersion: awsproviderconfig.openshift.io/v1beta1
          blockDevices:
          - ebs:
              iops: 0
              volumeSize: 120
              volumeType: gp2
          credentialsSecret:
            name: aws-cloud-credentials
          deviceIndex: 0
          iamInstanceProfile:
            id: ocp4-aws-qt9tx-worker-profile
          instanceType: m4.large
          kind: AWSMachineProviderConfig
          metadata:
            creationTimestamp: null
          placement:
            availabilityZone: us-east-1d
            region: us-east-1
          publicIp: null
          securityGroups:
          - filters:
            - name: tag:Name
              values:
              - ocp4-aws-qt9tx-worker-sg
          subnet:
            filters:
            - name: tag:Name
              values:
              - ocp4-aws-qt9tx-private-us-east-1d
          tags:
          - name: kubernetes.io/cluster/ocp4-aws-qt9tx
            value: owned
          userDataSecret:
            name: worker-user-data
status:
  availableReplicas: 1
  fullyLabeledReplicas: 1
  observedGeneration: 2
  readyReplicas: 1
  replicas: 1

replicas: 1となっているのが確認できます。

  • 追加されたMachineの詳細情報
ocp4-aws-qt9tx-worker-us-east-1d-64l7m
$ ./oc get machine -n openshift-machine-api ocp4-aws-qt9tx-worker-us-east-1d-64l7m -o yaml
apiVersion: machine.openshift.io/v1beta1
kind: Machine
metadata:
  annotations:
    machine.openshift.io/instance-state: running
  creationTimestamp: "2019-12-27T06:19:22Z"
  finalizers:
  - machine.machine.openshift.io
  generateName: ocp4-aws-qt9tx-worker-us-east-1d-
  generation: 2
  labels:
    machine.openshift.io/cluster-api-cluster: ocp4-aws-qt9tx
    machine.openshift.io/cluster-api-machine-role: worker
    machine.openshift.io/cluster-api-machine-type: worker
    machine.openshift.io/cluster-api-machineset: ocp4-aws-qt9tx-worker-us-east-1d
    machine.openshift.io/instance-type: m4.large
    machine.openshift.io/region: us-east-1
    machine.openshift.io/zone: us-east-1d
  name: ocp4-aws-qt9tx-worker-us-east-1d-64l7m
  namespace: openshift-machine-api
  ownerReferences:
  - apiVersion: machine.openshift.io/v1beta1
    blockOwnerDeletion: true
    controller: true
    kind: MachineSet
    name: ocp4-aws-qt9tx-worker-us-east-1d
    uid: e9998df3-27eb-11ea-a1e1-1285990f1d61
  resourceVersion: "296241"
  selfLink: /apis/machine.openshift.io/v1beta1/namespaces/openshift-machine-api/machines/ocp4-aws-qt9tx-worker-us-east-1d-64l7m
  uid: d2cb0d58-2870-11ea-acf1-1259770d53d1
spec:
  metadata:
    creationTimestamp: null
  providerID: aws:///us-east-1d/i-06040dc85dd9592fc
  providerSpec:
    value:
      ami:
        id: ami-01e7fdcb66157b224
      apiVersion: awsproviderconfig.openshift.io/v1beta1
      blockDevices:
      - ebs:
          iops: 0
          volumeSize: 120
          volumeType: gp2
      credentialsSecret:
        name: aws-cloud-credentials
      deviceIndex: 0
      iamInstanceProfile:
        id: ocp4-aws-qt9tx-worker-profile
      instanceType: m4.large
      kind: AWSMachineProviderConfig
      metadata:
        creationTimestamp: null
      placement:
        availabilityZone: us-east-1d
        region: us-east-1
      publicIp: null
      securityGroups:
      - filters:
        - name: tag:Name
          values:
          - ocp4-aws-qt9tx-worker-sg
      subnet:
        filters:
        - name: tag:Name
          values:
          - ocp4-aws-qt9tx-private-us-east-1d
      tags:
      - name: kubernetes.io/cluster/ocp4-aws-qt9tx
        value: owned
      userDataSecret:
        name: worker-user-data
status:
  addresses:
  - address: 10.0.191.196
    type: InternalIP
  - address: ""
    type: ExternalDNS
  - address: ip-10-0-191-196.ec2.internal
    type: InternalDNS
  lastUpdated: "2019-12-27T06:23:45Z"
  nodeRef:
    kind: Node
    name: ip-10-0-191-196.ec2.internal
    uid: 50608a5c-2871-11ea-a4d3-0aa8664615c9
  providerStatus:
    apiVersion: awsproviderconfig.openshift.io/v1beta1
    conditions:
    - lastProbeTime: "2019-12-27T06:19:24Z"
      lastTransitionTime: "2019-12-27T06:19:24Z"
      message: machine successfully created
      reason: MachineCreationSucceeded
      status: "True"
      type: MachineCreation
    instanceId: i-06040dc85dd9592fc
    instanceState: running
    kind: AWSMachineProviderStatus
  • ノード詳細
ip-10-0-191-196.ec2.internal
$ ./oc get nodes ip-10-0-191-196.ec2.internal -o yaml
apiVersion: v1
kind: Node
metadata:
  annotations:
    machine.openshift.io/machine: openshift-machine-api/ocp4-aws-qt9tx-worker-us-east-1d-64l7m
    machineconfiguration.openshift.io/currentConfig: rendered-worker-2167ebc4b5181931d0ce49a36db005e9
    machineconfiguration.openshift.io/desiredConfig: rendered-worker-2167ebc4b5181931d0ce49a36db005e9
    machineconfiguration.openshift.io/state: Done
    volumes.kubernetes.io/controller-managed-attach-detach: "true"
  creationTimestamp: "2019-12-27T06:22:53Z"
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/instance-type: m4.large
    beta.kubernetes.io/os: linux
    failure-domain.beta.kubernetes.io/region: us-east-1
    failure-domain.beta.kubernetes.io/zone: us-east-1d
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: ip-10-0-191-196
    kubernetes.io/os: linux
    node-role.kubernetes.io/worker: ""
    node.openshift.io/os_id: rhcos
  name: ip-10-0-191-196.ec2.internal
  resourceVersion: "305698"
  selfLink: /api/v1/nodes/ip-10-0-191-196.ec2.internal
  uid: 50608a5c-2871-11ea-a4d3-0aa8664615c9
spec:
  providerID: aws:///us-east-1d/i-06040dc85dd9592fc
status:
  addresses:
  - address: 10.0.191.196
    type: InternalIP
  - address: ip-10-0-191-196.ec2.internal
    type: Hostname
  - address: ip-10-0-191-196.ec2.internal
    type: InternalDNS
  allocatable:
    attachable-volumes-aws-ebs: "39"
    cpu: 1500m
    hugepages-1Gi: "0"
    hugepages-2Mi: "0"
    memory: 7547440Ki
    pods: "250"
  capacity:
    attachable-volumes-aws-ebs: "39"
    cpu: "2"
    hugepages-1Gi: "0"
    hugepages-2Mi: "0"
    memory: 8161840Ki
    pods: "250"
  conditions:
  - lastHeartbeatTime: "2019-12-27T06:48:46Z"
    lastTransitionTime: "2019-12-27T06:22:53Z"
    message: kubelet has sufficient memory available
    reason: KubeletHasSufficientMemory
    status: "False"
    type: MemoryPressure
  - lastHeartbeatTime: "2019-12-27T06:48:46Z"
    lastTransitionTime: "2019-12-27T06:22:53Z"
    message: kubelet has no disk pressure
    reason: KubeletHasNoDiskPressure
    status: "False"
    type: DiskPressure
  - lastHeartbeatTime: "2019-12-27T06:48:46Z"
    lastTransitionTime: "2019-12-27T06:22:53Z"
    message: kubelet has sufficient PID available
    reason: KubeletHasSufficientPID
    status: "False"
    type: PIDPressure
  - lastHeartbeatTime: "2019-12-27T06:48:46Z"
    lastTransitionTime: "2019-12-27T06:23:45Z"
    message: kubelet is posting ready status
    reason: KubeletReady
    status: "True"
    type: Ready
  daemonEndpoints:
    kubeletEndpoint:
      Port: 10250
  images:
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:d5de6bd0ca757e07c58651234ceac857b24422fba98ed0b2912e51ba5fa2d4ee
    - <none>:<none>
    sizeBytes: 1194804151
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:aa6b4ea74e537e53aa7b72f2d479eafbad60c78e9ea49e3bd5b59720cd46c332
    - <none>:<none>
    sizeBytes: 405473489
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:0048e6f8730510893370553c1386e34827abcdb4dffaa2d392f1614c63a1c9c7
    - <none>:<none>
    sizeBytes: 388527143
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:1d7fdf7cacbd78bef24f9eb9d355161529ab2d561896de62572d81e55b61d370
    - <none>:<none>
    sizeBytes: 323890713
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b10e3e94d34509b1bc5d826b0ea33c352eefd37c157b386580f2b87f7d35bf40
    - <none>:<none>
    sizeBytes: 318297754
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:e451a219626274f7556b0ad21ff7bb2ca31be2ddd93f4c7533da49b78c82678d
    - <none>:<none>
    sizeBytes: 306490354
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:c919d6f77371e7d4a5f2d30cdc5d5bf3942c001c1ca82640fe5d1c15f7377cbd
    - <none>:<none>
    sizeBytes: 305375776
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:a8129d076e19fea59b3f9e8a04fbc0e0cdf53321ef3ab460bdbd1ffbd2230438
    - <none>:<none>
    sizeBytes: 285110290
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:4debe16999ebb9ca954822a6c75ee4461186be6eeb13313bf4ede367264ba5e3
    - <none>:<none>
    sizeBytes: 282984020
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9be3b6804fbb09d58c352a2110ad42d79c158dc258d7b02244bf209e453a7148
    - <none>:<none>
    sizeBytes: 255927512
  - names:
    - quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:a81e1a02bb25f93e6f3d3b9d5ddddb07a0c8025b4e5bd717cc6e4a6f3b8bdea2
    - <none>:<none>
    sizeBytes: 250722882
  nodeInfo:
    architecture: amd64
    bootID: a4b39f9a-09f4-4889-8fcb-e73105aeb683
    containerRuntimeVersion: cri-o://1.14.11-0.24.dev.rhaos4.2.gitc41de67.el8
    kernelVersion: 4.18.0-147.0.3.el8_1.x86_64
    kubeProxyVersion: v1.14.6+cebabbf4a
    kubeletVersion: v1.14.6+cebabbf4a
    machineID: 0c252dda944644e1af2d6f5cdec3c6c6
    operatingSystem: linux
    osImage: Red Hat Enterprise Linux CoreOS 42.81.20191210.1 (Ootpa)
    systemUUID: ec22f9cf-8e3c-84a9-5739-1c33d4822876

まとめ

oc scaleコマンドを使って簡単にworkerノードを追加することができました。

この後は、作成したOpenShiftクラスタを削除した話を別の記事に書きます。
→こちら(AWS上に導入したOpenShiftを削除する

参考

マシン管理

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む