- 投稿日:2019-12-30T23:58:14+09:00
YAMAHAルーター経由でOracle CloudとAWSをIPSec VPNで接続してみてみた
■目的
YAMAHAルーターとOCI接続を数多くやってきましたが、YAMAHAルーター経由したOCIとAWSのIPSec複数拠点接続設定の問い合わせもよくくる、、
ということで、今回はGIUかんたん接続でYAMAHAルーターとAWS接続をやってみてみます。■構成図
YAMAHAルーターは、イプシムのSIMを入れたNVR700wを使用します。
AWS側は、事前にVPC,EC2インスタンスを作成しておきます。今回は、仮想プライベートゲートウェイの作成から行います。
OCI側は、事前に以前の記事を参考に接続設定をします■AWSとYAMAHAルータ IPSec接続設定
●仮想プライベートゲートウェイの作成
① 仮想プライベートゲートウェイ画面
VPCダッシュボードから、「仮想プライベートゲートウェイ」を選択し、[仮想プライベートゲートウェイの作成]をクリック
② 仮想プライベートゲートウェイの作成画面1
以下項目を設定し[仮想プライベートゲートウェイの作成]をクリック
・名前タグ:任意の名前を設定 ・ASN: AmazonのデフォルトASNを選択③仮想プライベートゲートウェイの作成画面2
「作成画仮想プライベートゲートウェイの作成しました。」
が表示されたら、[閉じる]をクリック
●VPN接続の作成
① サイト間のVPN接続画面
VPCダッシュボードから、「サイト間のVPN接続」を選択し、[VPN接続の作成]をクリック
②VPN接続の作成画面1
以下項目を設定し[VPN接続の作成]をクリック
・名前タグ: 任意の名前を設定 ・Target Gatway type: ここではVirtual Private Gatwayを選択 ・仮想プライベートゲートウェイ: 作成した仮想プライベートゲートウェイを選択 ・カスタマーゲートウェイ: 新規を選択 ・BGP ASN: 任意のPriavate ASNを設定 ・ルーティングオプション: ここでは動的BGPを選択③VPN接続の作成画面2
「VPN接続の作成リクエストが成功しました」が表示されたことを確認し[閉じる]をクリック
④ サイト間のVPN接続画面
作成したBPN接続が表示され、状態が「保留中」であることを確認
■Amazon VPCとVPN(IPsec)接続Web GUI設定
●AWS アクセスキー発行
YAMAHAルーターとAWSをGUIでIPSec接続できるように
接続設定用AWSユーザーを作成し、AWS IAMアクセスキー ID とシークレットアクセスキーを作成します①AWS Webコンソールから、「IAM」> [ユーザー]画面から[ユーザーを追加]をクリック
②ユーザー設定画面
以下項目を入力し[次のステップ:アクセス制限]をクリック
・ユーザー名: 任意の名前を入力 ・プログラムによるアクセス: チェックする③ユーザーを追加画面
[ユーザーをクループに追加]を選択し、[グループの作成]をクリック
④グループの作成画面
以下設定をし、[グループの作成]をクリック
・グループ名: 任意の名前を入力 ・ポリシー名: [AmazonVPCReadOnlyAccess]を選択⑤ユーザーを追加画面
作成した「グループ」と「アタッチされたポリシー」を確認して、[次のステップ:確認]をクリック
⑥ユーザーを追加画面(タグの追加)
タグの追加は必要に応じて設定し、[次のステップ:確認]をクリック
⑦ ユーザーを追加画面(確認)
表示された内容を確認し、[ユーザーの作成]をクリックします。
⑧ユーザーを追加画面(成功)
[.csv のダウンロード]をクリックしてダウンロード
accessKeys.csvファイルがダウンロードされます
⑨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] > [クラウド接続]を選択し、「新規作成」の[新規]をクリック
②サービス種別の選択画面
③接続設定画面
以下設定を行い[次へ]をクリック
・設定名: 任意の名前を設定 ・アクセスキーID: ダウンロードしたcsvの「Access key ID」を設定 ・シークレットアクセスキー: ダウンロードしたcsvの「Secret access key」を設定 ・VPN ID: 作成したVPN接続のIDを設定 ・リージョン: VPCのリージョンを設定 ・AWSからの設定取得: [取得する]を選択④入力内容を確認画面
⑤内容の確認と取得画面1
進捗状況がすべてチェックされグリーンになり問題ないことを確認し、[OK]をクリック
⑥内容の確認と取得画面2
●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のステータスが「アップ」であることを確認
■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■参考
- 投稿日:2019-12-30T22:46:02+09:00
AWS codedeploy 流れ
- 投稿日:2019-12-30T22:03:59+09:00
SQSとSNSによるPub/SubをCloudFormationで構築
はじめに
クラウドコンピューティングやマイクロサービスなどが盛り上がる中、スケールアウトや並列化との相性の良さなどからシステム間の通信方式としてPub/Subモデルが注目されています。Pub/Subモデルの特徴などは様々な記事にて語られていますのでここでは省略します。
本記事では Amazon SNS と Amazon 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以下ではシステムAとSNSトピックを合わせて Publisher(パブリッシャー)、システムBとSQSキューを合わせて Subscriber(サブスクライバー) と呼びます。
本記事ではPublisherとSubscriberは 同じAWSアカウント で 別のCloudFormationスタック に構築するとします。同じスタックで定義する場合はOutputsやImportValueなどが不要となります。別のAWSアカウント間で構築したい場合はまた設定が異なります(本記事の対象外です)。
Publisher側(SNSトピック)の構築
CloudFormationによりSNSトピックを作成します。またSubscriber側からSNSトピックのARNを参照するためにOutputsセクションを定義しています。今回は細かなパラメータは省略していますので、以下の公式ドキュメントを参考にカスタマイズしてください。
system_a.yamlAWSTemplateFormatVersion: '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.shaws cloudformation create-stack \ --stack-name system-a-stack \ --template-body file://system_a.yamlSubscriber側(SQSキュー)の構築
CloudFormationによりSNSトピックをサブスクライブしてデータを格納するSQSキューとそのデッドレターキューを作成します。また今回はSQSキューへのアクセス権限(Queueポリシー)やSNSトピックへのサブスクリプションもこちらで定義しています。SNSトピックのARNをPublisher側で出力したものを参照するためImportValue関数を用いています。その他の細かい設定は以下を参照してください。
system_b.yamlAWSTemplateFormatVersion: '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.shaws 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リソースを定義しました。実際の利用にあたっては今回触れていない細かなパラメーターの設定やデッドレターキューの利用などもぜひご検討ください。
- 投稿日:2019-12-30T21:20:20+09:00
サーバーレスな郵便番号検索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,Note6Step2:S3にCSVデータをアップロード
バケットを作成の上、対象のCSVファイルをアップロード
Step3:S3 Selectを試してみる
S3 Selectタブ選択して、画面下の次へを押す。
SQLが入力できることを確認
Step4:Lambdaを作成
・ 言語はPython
・ 作成後、IMAロールにS3の読み取り権限を付与する
・ 対象のロールからS3ReadOnlyAccessを付与する
・ ソースコードは以下にて作成
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 recordsStep5:APIGetWayを作成
・ RESTを選択、新しいAPIを選択、適当なAPI名を入力
・ メソッドの作成、GETメソッドを選択、統合タイプをLambdaにして、Lambda関数名に上記でセットした名前にする
・ 統合リクエストを選択
・ マッピングテンプレートにapplication/jsonと入力して、チェックをつけ、
テンプレートに設定するGETパラメータの値を入力・ APIのデプロイを選択。
・ ステージ名をつけて、保存すれば・・・
完成!
完成したURLを叩くと、JSON形式で結果が返ってくる。
PostCodeがパラメーターになっている。↓ レスポンス例
最後に
LamdbaでAPI作れて便利ですが、ただではないです。
Lamdbaは呼ばれるたびにお金がかかります。あとパフォーマンスは要チェックです。
- 投稿日:2019-12-30T21:20:20+09:00
サーバーレスな郵便番号検索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,Note6Step2:S3にCSVデータをアップロード
バケットを作成の上、対象のCSVファイルをアップロード
Step3:S3 Selectを試してみる
S3 Selectタブ選択して、画面下の次へを押す。
SQLが入力できることを確認
Step4:Lambdaを作成
・ 言語はPython
・ 作成後、IMAロールにS3の読み取り権限を付与する
・ 対象のロールからS3ReadOnlyAccessを付与する
・ ソースコードは以下にて作成
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 recordsStep5:APIGetWayを作成
・ RESTを選択、新しいAPIを選択、適当なAPI名を入力
・ メソッドの作成、GETメソッドを選択、統合タイプをLambdaにして、Lambda関数名に上記でセットした名前にする
・ 統合リクエストを選択
・ マッピングテンプレートにapplication/jsonと入力して、チェックをつけ、
テンプレートに設定するGETパラメータの値を入力・ APIのデプロイを選択。
・ ステージ名をつけて、保存すれば・・・
完成!
完成したURLを叩くと、JSON形式で結果が返ってくる。
PostCodeがパラメーターになっている。↓ レスポンス例
最後に
LamdbaでAPI作れて便利ですが、ただではないです。
Lamdbaは呼ばれるたびにお金がかかります。あとパフォーマンスは要チェックです。
- 投稿日:2019-12-30T20:22:01+09:00
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 -D3.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と同様の作業でも再起動は可能結果
以上の作業を行うことで、無事にデプロイが行えるようになりました。
上の作業を全て連続して行ったため、具体的にどの部分が原因でデプロイできなかったのかまでは分かりませんでした。ですが原因を追求するつもりもありませんでしたし、問題があった時の再起動は不都合がない限り全て行って差し支えないと考えます。
- 投稿日:2019-12-30T18:36:38+09:00
AWS Lambdaのログをtailする
はじめに
AWSマネジメントコンソールでAWS Lambdaのログを確認するのは面倒だ。
そう思ってググったんだが、当時、それっぽいことをやってる事例を見つけられなかった。さて、AWS LambdaのログはCloudWatchログに記録され、次のような構造をしてる。
CloudWatchログでは、個々の記録をイベントと呼んでるようだ。 一連のイベントをひとまとまりにしたものを、ログストリームと呼んでるようだ。 ログストリームは関数ごとにまとめられており、それをロググループと呼んでるようだ。これを踏まえると、tailは次のような流れになる。
tailしたいロググループを特定する while True: tailしたいロググループから最も新しいログストリームを見つける if 見つけたログストリームの最初の取得だったら: ログストリーム内のイベントを最初から取得する else: ログストリーム内の続きのイベントを取得する 少し待つPythonで書いたので
とりあえずboto3のインポートは必要となる。
#!/usr/bin/python3 import boto3CloudWatch 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が見つかった。
- 投稿日:2019-12-30T18:26:19+09:00
Route53を使用してEC2にドメイン名を紐づける
概要
Route53を使用して取得しているドメイン名をEC2に紐づけます。またEC2にapacheをインストールし、インターネット上からHTMLが表示できるようにします。
0. 前提条件
- AWSのアカウントを取得していること。
- AWSのセキュリティ対策として、IAMや多要素認証をしていること。
- お名前.comなどでドメインを取得していること。
- 本書ではWindows10 Proを使用します。
1. Route53に取得したドメインを紐づける
2. EC2を作成する
3. Elastic IPの設定
4. Elastic IPとRoute53を紐づける
以下の内容を入力し、「作成」をクリックする。
5. ドメイン名の紐づき確認
TeraTeamなどでインスタンスにログインする。
下記のコマンドを入力し、ドメイン名がインスタンスに紐づいたか確認する。
$ nslookup ドメイン名 Server: xxx.xxx.xxx.xxx Address: xxx.xxx.xxx.xxx#53 Non-authoritative answer: Name: ドメイン名 Address: xxx.xxx.xxx.xxx6. apacheのインストール
パッケージをアップデートする。
$ sudo yum -y updateapacheをインストールする。
$ sudo yum -y install httpdapacheのインストール確認をする。
$ httpd -v Server version: Apache/2.4.41 () Server built: Oct 22 2019 22:59:04apacheを起動する。
$ sudo systemctl start httpd
/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>最後に
Route53とEC2を組み合わせることでHTMLをインターネット上に公開することができます。これにより作成したホームページやポートフォリオをインターネット上に公開できます。
- 投稿日:2019-12-30T17:33:50+09:00
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をクリックすれば、アクセスできるはずです。
遷移先のページでこのように表示されれば、成功です。
終わりに
次はLambdaとdynamodbやS3と組み合わせて投稿しようかと思います。
- 投稿日:2019-12-30T14:25:02+09:00
Transit Gatewayを導入するときに気をつけたいポイント4選
0.はじめに
以下のような構成でVPC-AとVPC-Bを接続するためにTransit Gatewayを導入することを検討していました。検討時に気をつけたことやはまったことを共有します。
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.html3.インターネット接続を集約するときのルートテーブルの設定
インターネットに接続しない、純粋にVPC間をTransit Gatewayで接続する場合は Transit GatewayでVPC間通信する構成をTerraformで作成してみた で説明されている手順でできます。
ここで、例えばB-VPCからインターネットに抜ける通信を考えてみます。以下のようなイメージです。
Transit Gateway越しにインターネットに抜ける場合ポイントは以下です。
- publicサブネットを持たないVPC(本説明の場合はB-VPC)にあるサブネットのデフォルトゲートウェイはTransit Gateway
- publicサブネットを持つVPC(本説明の場合はA-VPC)の publicサブネット のルートテーブルに、B-VPCのCIDRに含まれる宛先IPアドレスの通信の経路を Transit Gateway宛 に設定する
- 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を導入する際はぜひ読んでおく資料かと思います。
- 投稿日:2019-12-30T14:14:52+09:00
【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を使用している場合は、削除前に他のユーザーに確認を取ると良いと思います。感想
めちゃめちゃ初心者なので、本当に些細なことでもご指摘・コメント等いただけますと幸いです。
参照
- 投稿日:2019-12-30T11:47:10+09:00
【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秒実行環境
→それぞれが隔離されたコンテナで実行
- 投稿日:2019-12-30T11:18:58+09:00
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.jar3. データベースへのデータ登録
サンプルデータをデータベースに登録するための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.javaimport 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.jsp5. 動作確認
Tomcatサービスを再起動する # service tomcat restart Redirecting to /bin/systemctl start tomcat.service ブラウザからWebサーバの「パブリックDNS:8080/world/world.jsp」に接続し、 作成したWebページの表示及び、処理の動作が正しく行われることを確認する。
- 投稿日:2019-12-30T09:56:07+09:00
【初心者向け】AssumeRole利用時のEKSクラスター作成について
この記事は Amazon EKS Advent Calendar 2019 の16日目の記事です。
公開が遅くなってしまい申し訳ありませんAWSの利用が進むにつれ、複数のAWSアカウントを利用することが多くなります。
開発、STG、本番と環境を分けるために利用したり、「課金管理を行いたい」、「プロジェクトが違う」など理由は様々ですが、複数のAWSアカウントごとにIAMユーザを発行するとアカウント管理が煩雑になってしまうため、1つのAWSアカウントからAssume Roleを利用して各AWSアカウントにアクセスする方法を採用されている方も多くいるかと思います。今回は、このような環境で、Assume Roleを利用しながら、EKSクラスタを作成し、そこにアクセスするまでを整理したいと思います。
Kubernetesは使い慣れているが、AWSは不慣れ、という方や、 複数のAWSアカウント利用に慣れていない方の助けになれば幸いです。なお、今回は例として下記のようなアカウント構成を想定します。
利用者の方は管理用アカウントにIAM Userとしてログインし、作業対象アカウントにAssume Roleを利用してアクセスして実際の作業を行います。
Assume Roleを利用した他アカウントへのアクセスについては下記のdocumentもご覧ください。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.htmlEKSの構築についてはこちらで紹介されているeksctlの開始方法 とコンソールの開始方法 それぞれのシナリオをAssume Roleで実施する方法について記載します。
「eksctlの開始方法」 の場合
eksctlを利用する場合、eksctlの開始方法 の 前提条件 でも説明されている通り、何も指定しない場合、AWS CLIのdefault プロファイルの認証情報が利用されます。
今回想定している構成の場合、利用者の方は管理用アカウントのIAM Userのアクセスキー/シークレットアクセスキーをお持ちのはずなので、このままこちらの手順を実行すると、管理用アカウント上にEKS クラスタが作成されてしまいます。管理用アカウント上にEKS クラスタが作成されてしまう
本来は、下記のように作業対象アカウントにEKS クラスタを作成することが目的のはずです。
本来やりたいこと→作業対象アカウントにEKS クラスタを作成したい
手順
上記は下記の手順を実施することで実現できます。
- CLI設定ファイルで作業対象アカウントのRoleを利用するように設定する
- ドキュメントの手順に沿って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 = defaultCLIで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以上です。
- 投稿日:2019-12-30T08:38:34+09:00
個人開発向け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
※ 個人アカウント利用での予算感が分かっていないので、一月様子を見た後、別途更新予定。
全リージョンで有効化。
- StackSets用IAM Roleを2個作成。
- 全リージョンへStacksetする。
- 参考:「一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った」
- リージョンの指定~の下りはコンソールのUIが変更されてて、「すべてのリージョンを追加」ボタンを押せばOK。
- 作成まで10分くらいかかる
Config
- 個人用アカウントなので、とりあえず有効化をゴールとする。
- StackSetsで以下のセッティング
ステップ 設定 値 覚書 1 テンプレートの選択 前提条件 - テンプレートの準備 サンプルテンプレートを使用 - 1 テンプレートの選択 サンプルテンプレートの選択 AWS Configの有効化 - 2 スタックの詳細を指定 NotificationEmail <自分のメアド> - 3.fin.
これであとは自由だ。
Cloud9建てて好きなことして遊びましょう。RTA的な振り返り
- CloudTrail, GuardDutyもStackSetsのテンプレートにあるので、それで十分かも(やってて気づいた)
- SNSトピックのConfirmはStackSetのスキマ時間で実施しよう。
- 結局記事書きながら作ってたので時間測れてない(笑) 30~長くても60分あればいけるかな。
- 投稿日:2019-12-30T08:38:34+09:00
個人開発向け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
※ 個人アカウント利用での予算感が分かっていないので、一月様子を見た後、別途更新予定。
全リージョンで有効化。
- StackSets用IAM Roleを2個作成。
- 全リージョンへStacksetする。
- 参考:「一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った」
- リージョンの指定~の下りはコンソールのUIが変更されてて、「すべてのリージョンを追加」ボタンを押せばOK。
- 作成まで10分くらいかかる
Config
- 個人用アカウントなので、とりあえず有効化をゴールとする。
- StackSetsで以下のセッティング
ステップ 設定 値 覚書 1 テンプレートの選択 前提条件 - テンプレートの準備 サンプルテンプレートを使用 - 1 テンプレートの選択 サンプルテンプレートの選択 AWS Configの有効化 - 2 スタックの詳細を指定 NotificationEmail <自分のメアド> - 3.fin.
これであとは自由だ。
Cloud9建てて好きなことして遊びましょう。RTA的な振り返り
- CloudTrail, GuardDutyもStackSetsのテンプレートにあるので、それで十分かも(やってて気づいた)
- SNSトピックのConfirmはStackSetのスキマ時間で実施しよう。
- 結局記事書きながら作ってたので時間測れてない(笑) 30~長くても60分あればいけるかな。
- 投稿日:2019-12-30T02:16:00+09:00
awsのセキュリティグループでipアドレスやポートの設定を一括で行う方法
awsの操作をUIだけで進めようとすると、情報の入力に時間がかかってしまうときがありますよね!
最近では、セキュリティグループを作成しようとした時、「めんどくさい!」って思っちゃいました。
そこで、コマンド駆使して、ミス無く登録が行えたので、ここにメモして置こうと思います具体的に使ったコマンドの解説
下記が具体的に使ったコマンドです。
このコマンドを実行する前に、下記の準備をする必要があります。
- ルールが空のセキュリティグループ
- 作ったセキュリティグループの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 &
- 投稿日:2019-12-30T01:53:17+09:00
AWS Workspacesにまつわる話
- 投稿日:2019-12-30T00:40:37+09:00
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ノードを追加していましたが、一緒に削除されています。
- 投稿日:2019-12-30T00:21:58+09:00
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ノードが設定・起動していないMachinesetocp4-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のリソース
一番下の
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を削除する)参考