Python boto3でCLB, ALB, NLBの情報を取り出す

Python/boto3でLBの情報を取得する boto3でロードバランサの情報を取得を取得する。CLBとALB/NLBで利用するAPIが異なるので注意する。 動作環境情報 Ubuntu18.04 LTS Python 3.6.9 boto3 (1.11.8) ソースコード import boto3 from boto3.session import Session # セッションのセットアップ # aws cliの利用時に profileを設定していれば boto3が勝手に拾ってくれるようだ def setup(): session = Session( profile_name = "profile_hoge" ) return session # CLBの情報取得 # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elb.html#ElasticLoadBalancing.Client.describe_load_balancers def get_clb_info(sess): elb = sess.client("elb") elb_info = elb.describe_load_balancers() for i in elb_info["LoadBalancers"]: lb_name = i["LoadBalancerName"] # ... その他色々情報が取れるが、LBによっては欠損している(辞書のKeyごと存在しない)情報もあるので # 辞書での情報取得時はKeyが事前にあるかどうかを確認した方がいい # NLB/ALBの情報取得 # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elbv2.html#ElasticLoadBalancingv2.Client.describe_load_balancers def get_elb_info(sess): elb = sess.client("elbv2") elb_info = elb.describe_load_balancers() for i in elb_info["LoadBalancers"]: lb_name = i["LoadBalancerName"] # . [続きを読む]

re:Invent2019に行ってきた(その1)

re:Invent 2019 に行ってきた

だいぶ間が空いたが今更ながらメモがてら行ってきた話を書きたい。 来年も行きたいな。

なお今年は日本から1700人以上参加したそうな、、、

最初は1ページで書くつもりだったけど、書いていたら長くなったのでその1とその2に分けることにする。 発表された内容とかEXPOで見かけたものはその2で書いていこう。

準備

荷物

ラスベガスの気温は日本とそんなに変わらない(ただしすごく乾燥している)らしかったので、冬の格好であとは普通の海外旅行と同じ準備をして行った。 冬は荷物がかさばるのがちょっとヤダな~と思ったので、Tシャツとか下着を2泊分にしてホテルで自分で洗濯して干していた。とても乾燥しているので、一晩あれば十分乾いたので助かった。

スーツケースは半分近く空けていった。主にEXPOでのお土産獲得と、普通にラスベガスのお土産を家や会社に買っていくためである。 帰りはほぼスーツケースがいっぱいになったので正解だった。

ホテルとリゾートフィー

直前で宿を取ったので結構高いホテルだった…

早めに取ればAriaなど会場として使われているホテルでも1泊1.5万円~くらいで泊まれるようだ。 会場にはなっていないが近いところのホテルを選べばもっと安く上げることもできそう。でも古いホテルが多いので日本のビジホみたいに綺麗なところは少ない。

なおラスベガスのホテルはリゾートフィーというサービス料がかかりこれが結構な痛手になる。泊まるホテルによるがAriaだと 50ドル 近く取られてしまう。他のアメリカのホテルだとこういうものに当たったことが無いので、ラスベガス特有のものかな?

なおホテルによって開催されるセッションの傾向があるので、参加したいセッションの傾向(例えば機械学習関連を沢山みたいなら今年はVenetian)に合っている会場に近いホテルを選ぶことで時間の節約ができる。

re:Invent セッション予約

re:Invent自体の登録は大分早い時期から可能だが、セッション予約は今年は10月末くらいから可能だった。ワークショップなど、自分で手を動かす類のものはすぐに埋まってしまうので、できるならセッション予約が可能になった日に実施すべき。

セッション自体は後から動画が公開されるのでそっちで確認しても良いとは思うが、ワークショップなど一部の体験型のものは現地に行かないと参加できないのでワークショップ系を優先した方が満足度は高い。

日本からの経路と乗り継ぎ時間

残念ながら日本からマッカラン国際空港(ラスベガス空港)への直行便が無いので、基本的にはアメリカ西海岸のいずれかの空港を経由してアクセスすることになるはず。格安の経路ではハワイアン航空でホノルル空港経由という方法もあるようだ。

今回はサンフランシスコ空港を経由した。何回か国際線からアメリカ国内線へ乗り継ぐことを体験しているが、時間に余裕を持っていても毎度心配になる。 というのもアメリカ国内線へ乗り継ぐ場合、

日本で荷物預ける・手荷物検査受ける→アメリカ入りして入管→預け入れ荷物の受け取りして再度国内線へ預ける→もう一度手荷物検査/身体検査→アメリカ国内線に搭乗→現地入り

となる。国際線から国内線に入る時に荷物受け取り→再度預け入れ「しない」パターンに当たったことが無いのだがそういうルートもあるのだろうか。

アメリカの入国審査はKIOSKで簡略化されている空港もあるのでそちらを使うと大分楽ではあるが、それでもすごい人数が並ぶので国際線からアメリカ国内線への乗り継ぎは2.5時間程度は最低限確保しておいたほうが良い(自信が無ければ3時間)

復路は楽で、アメリカ国内線搭乗時に荷物預ける・手荷物検査を受ける→乗り継ぎ空港では移動のみ→国際線にそのまま搭乗して帰国

となる。往路に比べると楽だが、乗り継ぎ時間は往路と同様2時間程度はあった方が良い。アメリカ国内線は本当によく遅延するため。

ホテル到着後

レジストレーションと最初のSWAG

会場となっているホテル(か、マッカラン国際空港の中)で受付ができる。 受付では名前とパスポートを提示すると事前に登録しておいた顔写真入のIDカードが貰え、今後セッションに参加するときにはこのIDカードを入り口でスキャンすることになる。

会場となっているどのホテルでも空港でも、どこでも受付しても良いが、SWAGと呼ばれるパーカーなどのお土産が貰えるのは今年はメイン会場のVenetianに絞られており来年もその可能性があるので、移動当日は疲れているがVenetianまで行って登録ついでに早々にSWAGを貰う方が良さそう。

というのも毎年AWS印の入ったパーカーが貰えるようなのだが、各サイズは数に限りがあるため希望のサイズが残っているとは限らないためだ。実際私は1日目の午後に受け取りに行ったが、既にMサイズが無くなっていた。

会期中

会場と移動

会場として使われるホテルはどこもものすごく巨大(日本では見当たらないレベル)で、それを6つも使っている。しかもホテル間の距離が長く、例えばVenetianからAriaまで(混んでいる時間だと)バスで30分程度かかることもあった。 したがってセッション間は1時間程度開けている方がよい。ホテルを移動しないなら間が30分程度でもいけるが、開始の15分前くらいにはIDスキャンが始まるのでそれまでにセッション会場に並んでおく必要がある。

ホテル間はシャトルバスが頻繁に走っており、ホテル間移動でタクシー使った方が早い!というような状況にはならなかった。数年前はシャトルバス本数が少なすぎてタクシーを使う人が多かったようだが改善されたらしい。

Overflowルーム

セッションが人気の場合Overflowルームが追加されることがある。OverflowルームはAria等の会場で用意されている、でかいディスプレイでセッションの中継を見ることができる場所で、ヘッドホンを付けて音声を聞くことができるので会場で聞くよりも英語が聞き取りやすかった。正直Overflowルームで受けた方が快適だったり。

食事

各会場で朝食、昼食は提供される。正直あまり美味しくないがチケット料金内に含まれると思えばまぁいいかな、、、というところ。 食事については日本人にはAriaが合っている気がする。ホテルごとに出てくる料理の傾向が異なるのだがAriaはアジアンフードが多かった。 聞いたところによると初日だか二日目だかの朝食には味噌汁も出たようだ。

夜のイベント

昼はセッションなりワークショップなりに参加するが、夜は何かしら特別なイベントが開催されている。

例えば開催前日の日曜日夜にはミッドナイト・マッドネスというイベントがあり、今年はそこでDeepComposerが発表された。月曜日にはマンデーナイトライブ、火曜日はAWS Heroに会うイベントやJTB主催のJapan Nightなど様々である。

https://aws.amazon.com/jp/blogs/news/reinvent-2019-midnight-madness-aws-deepcomposer/

Japan Nightは別途申し込み(有料)が必要だが、AWSが主催するイベントはほぼ全部無料である。

夜のイベントでは概ねご飯が提供されるので、そういったところでご飯にありつくこともできる(が、ご飯目当てで行くよりも皆様交流しましょうね)

会期後

ホテルからマッカラン国際空港へ移動する。 日本へ帰る場合、早朝に出発する便で日本までの国際線が飛ぶ空港まで移動することになる。聞いた話だと早朝でも渋滞することがあるらしいので、結構早めに空港まで行ったほうが良い。マッカランの受付はJTB主催のre:Inventツアーの人たちもいて日本人でごった返していたので早めに行くべし。

あと帰りはスーツケースが色々なSWAGで重くなっているはずなので、預け入れ荷物の重量制限には気をつけた方がいい。エコノミーで1つ32kgだった。

その2に続く

その2は画像多めでお送りします

続:Terraformに入門してみた(Lambda)

続: Terraform入門 これ や これ の続き。 今回は terraformで lambdaを管理してみる。ただし terraform での Lambdaの管理は辛いというような意見が散見されるので、良い方法ではないと思われる。 まぁあくまでも入門ということで。 公式はページ ここ terraformのコード data "archive_file" "lambda_zip" { type = "zip" source_dir = "${path.module}/src" output_path = "${path.module}/lambda_function_payload.zip" } resource "aws_lambda_function" "test_lambda" {# zipで固めたソースコードを指定する。ライブラリも含めて固める必要がある filename = "lambda_function_payload.zip"# Lambdaの関数名 function_name = "lambda_function_name"# Lambdaの利用するrole のarnを指定する role = "${aws_iam_role.iam_for_lambda.arn}"# 呼び出しのhandlerとなる関数 handler = "exports.test"# SHA256のhashをbase64でエンコードしたもの。 # zip化したファイル名を指定してあげれば良い。 source_code_hash = "${filebase64sha256("lambda_function_payload.zip")}"# 利用するランタイム, # pythonなら"python3.6" といった感じにかける。 runtime = "nodejs8.10"# タイムアウトの秒数指定 timeout = 300# 環境変数 environment { variables = { foo = "bar" } } } 注意点 Lambdaのソースコード自体は archive_fileで固めることができるが、 source_dir 、output_pathは相対パスだとうまく動かなかったので、 ${path. [続きを読む]

続:Terraformに入門してみた(VPC/サブネット/ピアリング等)

続:Terraform入門 これ の続き。 今回はVPCを2つ作って、サブネット、ルートテーブル、ピアリングまで実施する。 作るネットワーク VPC1, VPC2の2つがある。 VPC1, VPC2ともに public用のサブネットを持つ。 またインターネットゲートウェイもそれぞれ持つ。 publicサブネット同士をルーティングする。 publicからインターネットゲートウェイを抜けて外にアクセスできるようにする。 terraformのコード グローバルIPを使ってしまっているが、サンプルということで… ## 1つ目のVPCの設定とIGW resource "aws_vpc" "vpc01" { cidr_block = "192.165.0.0/16" tags = { Name = "vpc01" } } resource "aws_subnet" "subnet-vpc01-public" { vpc_id = aws_vpc.vpc01.id cidr_block = "192.165.0.0/24" availability_zone = "ap-northeast-1a" tags = { Name = "subnet-vpc01-public" } } resource "aws_internet_gateway" "igw-vpc01" { vpc_id = aws_vpc.vpc01.id tags = { Name = "igw-vpc01" } }## 2つ目のVPCの設定とIGW resource "aws_vpc" "vpc02" { cidr_block = "192. [続きを読む]

Terraformに入門してみた

Terraform使い始めた 仕事でterraformを使い始めたのでメモしておく。 なお、AWSと一緒に使う場合を記載する。 公式サイト https://www.terraform.io/ 対応してるIaaS等 https://www.terraform.io/docs/providers/index.html 意外とたくさん対応しているが、awsと組み合わせて使っている人が多いと思う。 Terraformでは一括して provider と呼んでいるようだ。 インストール Installing Terraform terraformはgoで作られているので各種環境に合わせたバイナリが用意されている。 したがってダウンロードしたバイナリをパスの通ったところに設置するだけで良い。 簡単で良い。 AWSと組み合わせて使う ※おそらくaws cliを使えるようにしておく必要はないと思うが、やっておいたほうが楽なのでおすすめ。 まずはsecretとaccess keyをAWSコンソールから発行する。 次にaws configureを実行しておく。 aws configure 出てくる内容に従って設定する。この辺はawsサイト見ればわかる。 *.tfファイルのフォーマット getting-started Build Infrastructure 公式ではJSONファイルでもかけるが、機械的に生成されたもののみJSONを使うことが推奨されているため、きちんとterraformのフォーマットに従って書いたほうが良いと思う。 Configuration files can also be JSON, but we recommend only using JSON when the configuration is generated by a machine. 個人的にも、JSONはコメントが書けないこともあり、構成ファイル等のフォーマットとしてはいまいちだと思う(yamlの方が良い) しかしAWSはpolicyなど設定する場合だいたいJSONである… awsにインスタンスを自動で立てるチュートリアル ここからawsにインスタンスを自動作成するチュートリアルを実施する。 注)Terraformのドキュメントはかなり丁寧に書かれているので、英語が苦でないならそちらを読むことをおすすめする。 初めてのtfファイル example.tfは以下の通り。 provider "aws" { profile = "default" region = "ap-northeast-1" } resource "aws_instance" "example" { ami = "ami-2757f631" instance_type = "t2. [続きを読む]

yum updateでurllib3のエラー

Amazon Linux2のyum updateでurllib3のエラー

Running transaction
  Updating   : python-urllib3-1.24.3-1.amzn2.0.1.noarch                                                                                                                         1/2 
Error unpacking rpm package python-urllib3-1.24.3-1.amzn2.0.1.noarch
error: unpacking of archive failed on file /usr/lib/python2.7/site-packages/urllib3/packages/ssl_match_hostname: cpio: rename
python-urllib3-1.10.2-3.amzn2.0.1.noarch was supposed to be removed but is not!
  Verifying  : python-urllib3-1.10.2-3.amzn2.0.1.noarch                                                                                                                         1/2 
  Verifying  : python-urllib3-1.24.3-1.amzn2.0.1.noarch                                                                                                                         2/2 

Failed:
  python-urllib3.noarch 0:1.10.2-3.amzn2.0.1                                               python-urllib3.noarch 0:1.24.3-1.amzn2.0.1                                              

Complete!

ここ

によるとurllib3がrpmのものとpipでインストールしたものでコンフリクトして起こってるらしいので、

sudo pip uninstall urllib3

でアンインストールしてからもう一度yum updateしてね、ということらしい。

AWSのgo用SDKでSQSに入ってくるメッセージを取得する

目的 インスタンスからgo用のAWS SDK でSQSに届くメッセージを取得したい。 公式APIリファレンスの場所 AWS SDK for Go API Reference インストール 先にgo getしておきましょう。 go get github.com/aws/aws-sdk-go/... 使い方 対象のSQSのキューのARNだけをリソースとして指定したPolicyを作り、ロールにアタッチする EC2等にそのロールを付与する ソースコード package main import ( "flag" "fmt" "log" "os" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/sqs" ) // // GetMessage will get messages in SQS queue. // func GetMessage() { params := &sqs.ReceiveMessageInput{ QueueUrl: aws.String(queueUrl), // Number of messages are got in one time. MaxNumberOfMessages: aws.Int64(10), // If there are no messages, keeping connection in 20 sec. [続きを読む]
AWS  Go  SQS 

AWSのgo用SDKでLambdaを呼び出す

目的 インスタンスからgo用のAWS SDK でLambdaを呼び出したい 注意)Lambdaをgoで書きたいとか、Lambda to Lambdaをgoで書きたいとかではない(でもやってることはほぼ同じ) 公式APIリファレンスの場所 AWS SDK for Go API Reference インストール 先にgo getしておきましょう。 go get github.com/aws/aws-sdk-go/... 使い方 credentialをインスタンスに保存するのは嫌なので、インスタンスに対して、Lambdaを起動させるためのロールを設定している前提. Lambdaを実行するだけなら、設定するロールは以下の2つだけで良いようだ。 lambda:InvokeFunction lambda:InvokeAsync ソースコード package main import ( "encoding/json" "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/lambda" ) // for response type Response struct { Message string `json:"message"` Ok bool `json:"ok"` } // data to input to Lambda type Data struct { Key1 string `json:"key1"` Key2 string `json:"key2"` Key3 string `json:"key3"` } // function to call Lambda func Handler() (Response, error) { // Data that is to send to the Lambda payload := Data{ Key1: "1", Key2: "2", Key3: "3", } // and transform it to json bytes. [続きを読む]
AWS  Go