継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

EC2 の起動制限がサーバー台数から vCPU での制限へ変更のアップデート情報を整理する

タダです.

EC2 で 新しいオンデマンドインスタンスの制限が設けられ,vCPU ベース制限がアナウンスされました.これまでの考え方と異なるため,この記事では今回のアップデートについて利用者側でどんな対応が必要になるか,という観点で整理していきます.

今回のアップデート概要

これまでは EC2 オンデマンドインスタンスの起動できる制限がこれまではサーバーの台数によって決まっていましたが,今回のアップデートで vCPUでの制限に変わります.

公式ブログでのアナウンス記事 aws.amazon.com

なお,この変更に伴い現状のインスタンスは影響は受けないですし,同じ数のインスタンス数は作成できるようになっています.

Q: これにより実行中のインスタンスは影響を受けますか?

いいえ。vCPU ベース制限をオプトインしても実行中のインスタンスには影響ありません。

Q: 引き続き同じ数のインスタンスを作成できますか?

はい。vCPU ベースのインスタンス制限により、数量ベースのインスタンス制限として、少なくとも同じ数のインスタンスを作成できます

vCPU の制限の種類は次の5つがあります.これらの制限の管理は EC2 または Service Quotas で行うことができます.CloudWatch メトリクスと組み合わせることが可能なため,アラートと組み合わせて設定・管理すると良いでしょう.vCPU 数の制限はデフォルトの制限数に各インスタンスサイズ毎の vCPU 制限が加えられて表示されます.

Q: vCPU ベースの制限とはどのようなものですか?

AWS アカウントでの 1 つ以上のオンデマンドインスタンスの実行は制限されています。Amazon EC2 は、 AWS アカウントで実行中のオンデマンドインスタンスに割り当てられた 総 vCPU (仮想中央演算処理装置) 数に基づき、各制限に対する使用量を測定します。次の表は、各インスタンスサイズの vCPU の数を示しています。インスタンスタイプにおける vCPU のマッピングは異なる可能性があります。詳細については、Amazon EC2インスタンスタイプを参照してください。

インスタンスサイズ毎の vCPU 制限数

インスタンスサイズ vCPU
nano 1
micro 1
small 1
medium 1
large 2
xlarge 4
2xlarge 8
3xlarge 12
4xlarge 16
8xlarge 32
9xlarge 36
10xlarge 40
12xlarge 48
16xlarge 64
18xlarge 72
24xlarge 96
32xlarge 128

Q: Amazon EC2 で実行できるオンデマンドインスタンスの数はどれくらいですか?

5 つの vCPU ベースのインスタンス制限があり、特定のインスタンスファミリーの使用できるキャパシティの量をそれぞれ定義します。ジェネレーション、サイズ、またはバリアント設定 (例: ディスク、プロセッサータイプ) に関係なく、特定のインスタンスファミリーの使用量はすべて、下記の表に記載されているファミリーの総 vCPU 上限に追加されます。新規の AWS アカウントでは、当初この上限よりも少ない数に制限されることがあります。

デフォルトの vCPU 制限数

制限対象 デフォルトの vCPU 制限
オンデマンド標準 (A, C, D, H, I, M, R, T, Z) インスタンス 1152 vCPU
オンデマンド F インスタンス 128 vCPU
オンデマンド G インスタンス 128 vCPU
オンデマンド P インスタンス 128 vCPU
オンデマンド X インスタンス 128 vCPU

よくある質問(vCPU 制限関連)

aws.amazon.com

今回のアップデートに伴なう利用者側で発生する対応

今回のアップデートで利用者側はどのような対応が必要になるのでしょうか.よくある質問に下記の記載があり,2019年10月24日以降に vCPU 制限に移行して2019年11月8日以降に台数制限は利用できなくなると記載があるので今のうちに適用して確認しておきましょう,というステータスですね.

Q: 何が変更されますか?

Amazon EC2 はオンデマンドインスタンス制限を、現在の数量ベースの制限から、新たに vCPU ベースの制限に移行し、AWS のお客様の制限管理エクスペリエンスを簡素化します。vCPU ベースの制限に対する使用量は、アプリケーションのニーズを満たすインスタンスタイプの任意の組み合わせを起動するためのAmazon EC2インスタンスタイプにおける vCPU (仮想中央演算処理装置) の数によって測定されます。2019 年 9 月 24 日から、vCPU ベースのインスタンス制限をオプトインできます。Amazon EC2は、2019 年 10 月 24 日からインスタンス制限を vCPU に移行し、2019 年 11 月 8 日以降、現在の数量ベースのインスタンス制限は利用できなくなるか、またはサポートされなくなります。

vCPU 制限によって起動するインスタンスが制限に引っかかっていないかの確認は下記の「vCPU 計算ツール」が役立ちます.

https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#LimitsCalculator:

例えば,EC2 のm5.large(vCPU 2コア) を5台起動する場合を計算すると以下のように算出してくれます.算出結果,10 vCPU 分サービスの上限緩和が必要になります.サーバーの起動計画時に使っていくと良いでしょう.

f:id:sadayoshi_tada:20191102173415p:plain

vCPU 制限のオプトインの実践

僕のアカウントはまだ vCPU 制限をオプトインしていなかったので適用してみます.EC2 の制限画面よりオプトイン可能です.

f:id:sadayoshi_tada:20191101084731p:plain

オプトインしてみたところ,vCPU 制限が有効化されるまで最大15分ほど要するようです. f:id:sadayoshi_tada:20191102171140p:plain f:id:sadayoshi_tada:20191102171145p:plain f:id:sadayoshi_tada:20191102171228p:plain

なお,有効化前なので台数ベースの起動制限が有効化になっていることを確認しておきます. f:id:sadayoshi_tada:20191102171448p:plain

オプトイン後の画面は以下の通りです.オプトインされたことと起動制限が vCPU ベースに切り替わっています. f:id:sadayoshi_tada:20191102171532p:plain f:id:sadayoshi_tada:20191102171543p:plain

Service Quotas 画面でも同様に切り替わっています. f:id:sadayoshi_tada:20191102171942p:plain

vCPU 制限のオプトアウトの実践

逆に,オプトアウトで台数制限に戻す場合もオプトイン同様に設定変更可能です.vCPU の検証中に切り戻したいときは下記の通り変更します.

f:id:sadayoshi_tada:20191102172425p:plain f:id:sadayoshi_tada:20191102172429p:plain f:id:sadayoshi_tada:20191102172437p:plain f:id:sadayoshi_tada:20191102172440p:plain

まとめ

EC2 の起動制限が vCPU ベースに変わるためアップデートされる利用者側の観点で情報を整理しました.vCPU の計算ツールは今後の運用を考えると頻繁に使う機会があると思うので慣れておきましょう.時間は少ないですが試されてない方々は vCPU ベースの制限をオプトインして11月8日以降のアップデートを迎える準備をしていくことをお勧めします.不明点や懸念がある場合,下記のブログもしくはAWS サポートを通じて詳細を確認していきましょう.

関連の公式解説記事 aws.amazon.com

組織内での AWS 利用のガバナンスとアジリティを向上させる『AWS Service Catalog』を使ってみる

タダです.

業務でマルチアカウントかつ多数の開発ベンダーの方々が利用する環境の運用において「AWS Service Catalog(以下,Service Catalog)」の利用場面があると思い,まずは「Service Catalog」の概要や利用方法を確認した後,マルチアカウントかつ多数の開発ベンダーの方々が利用する環境での「Service Catalog」を利用パターンを整理します.

はじめに

「Service Catalog」とは

Service Catalog」とは2つの特徴のあるサービスです.

  1. 組織内のインフラプロビジョニングをアジリティを効かせて対処ができるサービス
  2. ガバナンスを効かせながらチームやプロジェクトがセルフでプロビジョニングする仕組みを作ることが可能

以下が各種サービスに関する参考情報リソースです.

サービストップ aws.amazon.com

ドキュメント docs.aws.amazon.com

Black Belt Online Seminar

「Service Catalog」の利用メリット

Service Catalog」の利用メリットは,以下の通りです.

  • 組織内での AWS 利用を適切な権限を設定して環境をプロビジョニングが可能なことからより良い AWS 利用促進に寄与すること
    • 管理者視点では,利用者に適切な権限を設定してガバナンスを強化
    • 利用者視点では,適切な権限をもらった上で素早く自分たちで環境をプロビジョニングが可能

「Service Catalog」の用語

Service Catalog」の用語として以下のものがあります.

  • 製品 : CloudFormation テンプレートをパッケージ化したもの.
    • EC2 やストレージ,データベースなどの1つ以上の AWS リソースからなり,バージョン管理可能.
  • 制約 : 製品のデプロイ方法を制御.ポートフォリオごとに各製品に制約を追加.
    • テンプレート制約 : 製品を起動する時のユーザーが使用できるパラメータ(EC2 インスタンスタイプ等)を制限.
    • 起動制約 : 起動時にリソースをプロビジョニングするのに利用するロール.
    • 通知制約 : SNS トピックを使ってスタックのイベントに関する通知を受けることを可能にする.
  • ポートフォリオ: 製品の集合.ポートフォリオの単位でユーザーに製品の仕様を許可.
  • プロビジョニングされた製品 : 製品のインスタンス.

「Service Catalog」の利用可能なリージョン

2019年10月時点で「Service Catalog」の利用利用可能なリージョンは東京含め下記のリージョンで利用可能です.

「Service Catalog」の利用料金

Service Catalog」の利用料金はポートフォリオの数で決まります.1つのポートフォリオにつき1 か月あたり「$5」の固定料金です.

料金ページ aws.amazon.com

「Service Catalog」の利用

Service Catalog」の利用の仕方を下記のページを参考に進めていきます.

開始方法 docs.aws.amazon.com

1. 管理者および利用者への権限付与

まずは,「Service Catalog」の管理者と利用者への権限を設定します.管理者には,「AWSServiceCatalogAdminFullAccess」という管理ポリシーが用意されてますが,「AdministratorAccess」権限が付与されていれば追加の権限は不要です.もし,「AdministratorAccess」権限がなければ管理ポリシーに加え,下記のインラインポリシーも設定ください.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateKeyPair",
                "iam:AddRoleToInstanceProfile",
                "iam:AddUserToGroup",
                "iam:AttachGroupPolicy",
                "iam:CreateAccessKey",
                "iam:CreateGroup",
                "iam:CreateInstanceProfile",
                "iam:CreateLoginProfile",
                "iam:CreateRole",
                "iam:CreateUser",
                "iam:Get*",
                "iam:List*",
                "iam:PutRolePolicy",
                "iam:UpdateAssumeRolePolicy"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

利用者には「ServiceCatalogEndUserAccess」をアタッチします.利用者の権限には,インラインポリシーとしてProvisionProductアクションを付与する必要があります.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "servicecatalog:ProvisionProduct"
            ],
            "Resource": "*"
        }
    ]
}

ドキュメントリンク

管理者へのアクセス権限の付与 docs.aws.amazon.com

利用者へのアクセス権限の付与 docs.aws.amazon.com

2. ポートフォリオの作成

ポートフォリオを作っていきます.ポートフォリオの作成はサービストップ画面の「今すぐ始める」からスタートします. f:id:sadayoshi_tada:20191022100700p:plain f:id:sadayoshi_tada:20191022100715p:plain

ポートフォリオの作成が完了すると,以下の様な状態になります. f:id:sadayoshi_tada:20191022100647p:plain

3. 製品を作成する

ポートフォリオを作れば製品を追加する準備が整うので,Amazon Linux の開発環境を作るための「Linux Desktop」という製品を作ります.ドキュメントの指示に従って設定を入力します. f:id:sadayoshi_tada:20191022131108p:plain f:id:sadayoshi_tada:20191022131132p:plain f:id:sadayoshi_tada:20191022131152p:plain f:id:sadayoshi_tada:20191022131200p:plain

4. テンプレートに制約を追加

CloudFormation テンプレートに利用者の制約を追加していきます.以下のルールでLinux サーバーを起動する時にt2.microt2.smallインスタンスしか選択できない様制約を設定します.

{
  "Rules": {
    "Rule1": {
      "Assertions": [
        {
          "Assert" : {"Fn::Contains": [["t2.micro", "t2.small"], {"Ref": "InstanceType"}]},
          "AssertDescription": "Instance type should be t2.micro or t2.small"
        }
      ]
    }
  }
}

5. 起動制約を追加する

起動制約は利用者が製品を起動するときに IAM が引き受ける Service Catalog ロールを指定します.利用者が CloudFormation を使える様に テンプレート起動制約を追加します.以下の IAM ポリシーを設定し,IAMロールとして Service Catalogを選択して設定します.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:GetTemplateSummary",
                "cloudformation:SetStackPolicy",
                "cloudformation:ValidateTemplate",
                "cloudformation:UpdateStack",
                "ec2:*",
                "s3:GetObject",
                "servicecatalog:*",
                "sns:*"
            ],
            "Resource": "*"
        }
    ]
}

6. 利用者での動作確認

利用者の IAM ユーザーでログインし,「Service Catalog」でテンプレートを起動できるかを確認します. f:id:sadayoshi_tada:20191022133743p:plain

利用者の画面から作成した「Linux Desktop」が確認できます.起動するとインスタンスタイプはt2.microt2.smallしか選べない様になっており制約も効いています. f:id:sadayoshi_tada:20191022133748p:plain f:id:sadayoshi_tada:20191022133751p:plain f:id:sadayoshi_tada:20191022133756p:plain f:id:sadayoshi_tada:20191022133759p:plain f:id:sadayoshi_tada:20191022133802p:plain f:id:sadayoshi_tada:20191022133806p:plain

利用者の CloudFormation テンプレート起動が成功しました. f:id:sadayoshi_tada:20191022133810p:plain f:id:sadayoshi_tada:20191022133813p:plain

マルチアカウントでの「Service Catalog」の利用シーン

マルチアカウントでの「Service Catalog」の利用シーンについて下記の資料のアーキテクチャパターンを整理したいと思います.

Case1. Hub-Spoke パターン(マスターアカウントから各アカウントへのポートフォリオの共有)

マスターアカウントで製品を一元管理し,各アカウントにポートフォリオをコピーする利用です.一番ベーシックなパターンかと思います.CloudFormation テンプレートの制約はマスターアカウントでの設定が引き継がれ,各アカウントのポートフォリオに追加のテンプレート制約も設定可能です.

Case2. CI/CD

事例のページに記載がありますが,CI/CDパターンが紹介されていました.マルチアカウントでのステージングを構成する場合のプロビジョニング構成方法として参考になります.

まとめ

Service Catalog」のサービス概要およびマルチアカウントでの利用シーンを整理しました.今やマルチアカウントでの運用も増え,「AWS Organaizations 」と組み合わせて管理者に依存しない環境のプロビジョニングが開発のアジリティを高めていくことはビジネス成長に寄与すると思います.利用シーンが合えばサービス利用を検討していきたいところです.また,下記のリポジトリには「Service Catalog」で使うテンプレートが入っているので参考にするのもの良いでしょう.

AWS Organizations で使用できる AWS のサービス docs.aws.amazon.com

awslabs/aws-service-catalog-products github.com

RDS と Aurora の SSL/TLS 証明書のメンテナンスアナウンスについて

タダです.

RDS 及び Aurora で使っている CA 証明書の入れ替えがアナウンスされています.今回はこのメンテナンスの情報をまとめ,対処や注意点に触れて関係する方の一助になればと思います.

2019/10/25 更新

AWS ドキュメントのアップデートがあり,デフォルト証明書適用開始日が11/1 から 2020年1月14日変更になった模様です.

Any new RDS DB instances created after January 14, 2020 will use the new certificates by default. If you want to temporarily modify new DB instances manually to use the old (rds-ca-2015) certificates, you can do so using the AWS Management Console or the AWS CLI. Any DB instances created prior to January 14, 2020 use the rds-ca-2015 certificates until you update them to the rds-ca-2019 certificates

更新されたドキュメントページ https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.htmldocs.aws.amazon.com

2019/12/21 更新

AWS から RDS 及び Aurora の証明書更新に関してブログが更新されました.今回の記事でデータベースを再起動せずに証明書を入れ替えられる AWS CLImodify-db-instance--no-certificate-rotation-restart オプションが紹介されています.今回のメンテナンスは, SSL/TLS でのデータベース接続していないデータベースにも影響があります.本稼働中のデータベースでは再起動を入れづらいと思いますのでこれは利用者にとってとてもありがたいアップデートですね.

aws.amazon.com

注意点として,下記の引用にもある様に上記のコマンドで再起動を避けられるが,証明書の適用されるのは再起動が発生するタイミングとなります.

If you do not want to restart your database, you can use a new CLI option for the modify-db-instance CLI command (--no-certificate-rotation-restart) specifically to rotate and stage the new certificates on the database host to avoid a restart. However, new certificates will be picked up by the database only when a planned or unplanned database restart happens.

データベースを再起動したくない場合は、modify-db-instance CLIコマンドの新しいCLIオプション(--no-certificate-rotation-restart)を使用して、特にデータベースホストで新しい証明書をローテーションおよびステージングできます。再起動を避けます。ただし、データベースが新しい証明書を取得するのは、計画的または計画外のデータベースの再起動が発生した場合のみです。

AWS CLI ドキュメント

docs.aws.amazon.com

AWS からのメンテナンスアナウンス情報まとめ

概要

今回のメンテナンスの概要ですが,RDS 及び Aurora に接続する際に通信を暗号化で使う SSL/TLS 証明書のデフォルトがrds-ca-2015からrds-ca-2019に変更となります.それに伴い,証明書の入れ替えが RDS 及び Aurora で発生します.また,クライアント側でも利用しているルート証明書の入れ替えを行う必要があります.

メールでのアナウンス

AWS より発行されている本メンテナンスに関するメールの引用文です.

タイトル

Update Your Amazon RDS SSL/TLS Certificates by October 31, 2019

本文

Hello,

Please act before October 31, 2019 to address an upcoming interruption of your applications using RDS and Aurora database instances.

To protect your communications with RDS database instances, a Certificate Authority (CA) generates time-bound certificates that are checked by your database client software to authenticate any RDS database instance(s) before exchanging information. Following industry best practices, AWS renews the CA and creates new certificates on a routine basis to ensure RDS customer connections are properly protected for years to come. The current CA expires on March 5, 2020, requiring updates to existing RDS database instances with certificates referencing the current CA.

You are receiving this message because you have an Amazon RDS database instance(s) in the AP-NORTHEAST-1, AP-NORTHEAST-2, AP-SOUTHEAST-1, AP-SOUTHEAST-2 Region(s). If your applications connect to those instances using the Secure Sockets Layer (SSL) or Transport Layer Security (TLS) protocol please follow the detailed instructions in the link below to complete your update(s). If not completed, your applications will fail to connect to your DB instances using SSL/TLS after March 5, 2020.

We encourage you to test these steps within a development or staging environment before implementing them in your production environments. Beginning today, you can start testing and updating your existing RDS database instances. For detailed instructions, please visit: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.html

Any new RDS instances created after November 1, 2019 will default to using the new certificates. If you wish to temporarily modify new instances manually to use the old (rds-ca-2015) certificates, you can do so using the AWS console or the AWS CLI. Any instances created prior to November 1, 2019 will have the rds-ca-2015 certificates until you update them to the rds-ca-2019 version.

If you have questions or issues, please contact AWS Support at: https://aws.amazon.com/support

公式ブログでのアナウンス

公式ブログではよくある質問への回答まとめ記事がでていましたので関係しそうな方は要チェックです.

aws.amazon.com

利用者側での必要な対処について

利用者側で必要な対処は,2つあります.

参考ドキュメント

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.htmldocs.aws.amazon.com

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.htmldocs.aws.amazon.com

注意点

注意点として,ドキュメントにも記載がありますがインスタンスの再起動が発生します.本番のワークロードに乗っている場合は計画的に再起動を検討していきましょう.

また, RDS への SSL 接続していない場合でも来年の3月5日に強制アップデートがかかるため,rds-ca-2015を使っていれば再起動されていた、、、なんてことが発生しかねないため注意して再起動メンテナンスのタイミングを計画した方が良いでしょう.

2020 年 2 月 5 日以降、既存の DB インスタンスについて、2020 年 3 月 5 日の最終期限を迎える前に実施される強制アップデートのスケジュールの通知を送付させていただきます。もし、CA 証明書が 2020 年 3 月 5 日までにアップデートされなかった場合、お客様のアプリケーションからの SSL/TLS 接続は、CA 証明書が無効になっているため、失敗するようになります。この最終期限につきましては、CA 証明書が実際に無効になる日付であるため、延期することができません。

11月1日から起動したインスタンスにはデフォルト証明書がrds-ca-2019が適用されます.これは即ちポイントインタイムリカバリやスナップショットからの復元でも適用される点は注意です.

2019 年 11 月 1 日以降、お客様が新たに DB インスタンス (Amazon RDS DB インスタンス、Amazon Aurora DB クラスター、リードレプリカおよびスナップショットからのリストアを含む) を作成した場合、そのインスタンスはデフォルトで新しい CA 証明書 (rds-ca-2019) を使用いたします

なお,公式ブログにはデフォルト証明書の切り替えタイミングは変更の可能性が記されていますが,早急に対応すべきメンテナンスのため,11月1日目処に切り替えられるよう準備を進めることをお勧めします.

新規 DB インスタンスにおける CA 証明書のデフォルトの切り替え日 (2019 年 11 月 1 日) につきましては予定となっており、お客様からのフィードバックを元に延期する予定でございます。新しい切り替え日につきましては、追ってご連絡させていただきます。

今回のメンテナンスに関わるスケジュール

最後に,今回のメンテナンスに関するスケジュールを以下にまとめます.

Q: CA 証明書更新のタイムラインはどのようになっていますか?
2019 年 10 月 31 日: 当初 2019 年 11 月 1 日より新しい CA 証明書が新規 DB インスタンスで使用される予定だったため、CA 証明書アップデートの早期実施の推奨日
2019 年 11 月 1 日: 当初新しい CA 証明書が新規 DB インスタンスで使用開始される予定だった日
2020 年 2 月 5 日: 最終期限である 2020 年 3 月 5 日より数週間前に実施される強制アップデートについての通知が送付される予定の日付
2020 年 3 月 5 日: 古い CA 証明書が無効になり、強制アップデートが実行され、新しい CA 証明書を持っていないアプリケーションが SSL/TLS 接続性を失う日付

まとめ

RDS 及び Aurora の SSL/TLS 証明書 入れ替えに伴うメンテナンス概要,利用者側の対応及び注意点を整理しました.RDS や Aurora を利用されている方は多くいらっしゃるかと思いますので,再起動も発生しますし入念に準備を進めて行きましょう.

AWS 構成図を PlantUML で描画できる『AWS-PlantUML』

タダです.

AWS 環境の構成図を書く機会で PowerPointCacoo 等のサービスを使うことがあると思います.作図もコードで制御する方法もないかと思い調べてみたら,「AWS-PlantUML」というツールがありました.今回はこのツールを使って作図する方法と所感を書いていきます.

github.com

AWS-PlantUML」とは

AWS-PlantUML」とは,PlantUML 形式で AWS 構成図を書くためのツールになります.PlantUML の実行環境は調べればたくさん出てきますが,僕は普段 Visual Studio Code(以下,vscode)を使うため vscode で使う環境をセットアップしました.

plantuml.com

github.com

qiita.com

AWS-PlantUML」を導入するか

vscode の環境ができたら「AWS-PlantUML」のセットアップを行います.2つの方法があります.1つ目は,インターネット接続をしたくない場合にcommon.pumlをダウンロードして!include ディレクトリパス/common.pumlpumlファイルで@startumlの後に定義する方法です.

@startuml

!include ディレクトリパス/common.puml

github.com

2つ目は,下記のように直接リポジトリの URL を指定する方法です.今回は2つ目の方法で設定して進みます.

@startuml

!includeurl https://raw.githubusercontent.com/milo-minderbinder/AWS-PlantUML/release/18-2-22/dist/common.puml

!includeurl AWSPUML/common.puml

AWS-PlantUML」の使い方

AWS アイコンの指定方法

それでは,実際に構成図を書いていきます.まず,AWS のサービスアイコンの指定方法は以下のように定義します.!includeurl AWSPUML/までは共通ですが,それ以下のパスはリポジトリ内のdistディレクトリパスで指定します.また,アイコンの指定方法はAWS_SERVICE_NAME_UPPERCASE(puml resource name, display name)のように行います.

!includeurl AWSPUML/ApplicationServices/AmazonAPIGateway/AmazonAPIGateway.puml
!includeurl AWSPUML/Compute/AWSLambda/LambdaFunction/LambdaFunction.puml
!includeurl AWSPUML/Database/AmazonDynamoDB/AmazonDynamoDB.puml
!includeurl AWSPUML/Database/AmazonDynamoDB/table/table.puml

USER(user)
CLIENT(browser)
JAVASCRIPT(js,SDK)

AWSCLOUD(aws) {

    AMAZONS3(s3) {
        BUCKET(site,www.insecurity.co)
        BUCKET(logs,logs.insecurity.co)
    }

    AMAZONAPIGATEWAY(api)

    AWSLAMBDA(lambda) {
        LAMBDAFUNCTION(addComments,addComments)
    }

    AMAZONDYNAMODB(dynamo) {
        TABLE(comments,Comments)
    }
}

参考

https://github.com/milo-minderbinder/AWS-PlantUML/blob/master/dist/ApplicationServices/AmazonAPIGateway/AmazonAPIGateway.puml

  • Lambda アイコンへのパス

https://github.com/milo-minderbinder/AWS-PlantUML/blob/master/dist/Compute/AWSLambda/AWSLambda.puml

  • DynamoDB アイコンへのパス

https://github.com/milo-minderbinder/AWS-PlantUML/blob/master/dist/Database/AmazonDynamoDB/AmazonDynamoDB.puml

サービス間のシーケンス図

サービス間のシーケンス図は下記のような指定で描画できます.例えば,以下の指定だと S3 バケット間の連携を記載できます.

AMAZONS3(s3) {
    BUCKET(site,www.insecurity.co)
    BUCKET(logs,logs.insecurity.co)
}
site .r.> logs : events

f:id:sadayoshi_tada:20191012160248p:plain

その他の記法

その他の記法は,PlantUML の文法を参考に記載できます.

qiita.com

作図コードのサンプル例

コードの参考例として下記のような定義で vscode 上でプレビューして状況を確認できます.

@startuml
!define AWSPUML https://raw.githubusercontent.com/milo-minderbinder/AWS-PlantUML/release/18-2-22/dist

!includeurl AWSPUML/common.puml
!includeurl AWSPUML/ApplicationServices/AmazonAPIGateway/AmazonAPIGateway.puml
!includeurl AWSPUML/Compute/AWSLambda/AWSLambda.puml
!includeurl AWSPUML/Compute/AWSLambda/LambdaFunction/LambdaFunction.puml
!includeurl AWSPUML/Database/AmazonDynamoDB/AmazonDynamoDB.puml
!includeurl AWSPUML/Database/AmazonDynamoDB/table/table.puml
!includeurl AWSPUML/General/AWScloud/AWScloud.puml
!includeurl AWSPUML/General/client/client.puml
!includeurl AWSPUML/General/user/user.puml
!includeurl AWSPUML/SDKs/JavaScript/JavaScript.puml
!includeurl AWSPUML/Storage/AmazonS3/AmazonS3.puml
!includeurl AWSPUML/Storage/AmazonS3/bucket/bucket.puml


skinparam componentArrowColor Black
skinparam componentBackgroundColor White
skinparam nodeBackgroundColor White
skinparam agentBackgroundColor White
skinparam artifactBackgroundColor White


USER(user)
CLIENT(browser)
JAVASCRIPT(js,SDK)

AWSCLOUD(aws) {

    AMAZONS3(s3) {
        BUCKET(site,www.insecurity.co)
        BUCKET(logs,logs.insecurity.co)
    }

    AMAZONAPIGATEWAY(api)

    AWSLAMBDA(lambda) {
        LAMBDAFUNCTION(addComments,addComments)
    }

    AMAZONDYNAMODB(dynamo) {
        TABLE(comments,Comments)
    }
}

user - browser

browser -d-> site :**1a**) get\nstatic\ncontent
site ~> logs :1a
site .u.> browser :**1b**
browser - js
js -r-> comments :**2a**) get\ncomments
comments ..> js :**2b**

js -r-> api :**3**) add\ncomment

api -d-> addComments :**4**

addComments -> comments :**5**

comments ..> js :**6**) new\ncomments
@enduml

プレビュー画面例 f:id:sadayoshi_tada:20191012155049p:plain

構成図をアウトプットする

作図したデータを HTML や PDF ファイルなどに出力する方法も見ておきます.プレビュー画面上で右クリックし,Open in Browserをクリックします.ブラウザで表示後,右クリックし別名で保存をクリックすれば HTML ファイルで保存でき,印刷をクリックして PDF 保存も可能です.

f:id:sadayoshi_tada:20191012155320p:plain

f:id:sadayoshi_tada:20191012155754p:plain

まとめ

PlantUML 形式で AWS 構成図を作図する「AWS-PlantUML」の紹介と,簡単な使い方を紹介しました.手動で細かく描画するよりコードでサービス間のシーケンス図を書けるのは普段の手間を考えると楽ですし,コードで管理できるのでバージョン管理もしていきやすいのではと思いました.AWS のアイコンの中にはまだ対応が追いついていないもの(EKSなど)もあるので,issue出してリクエスト出してよりよくしていくようお願いしていきたいですね!

AWS 謹製のデータ分析モジュール『AWS Data Wrangler』チュートリアルの紹介

タダです.

AWS 謹製の Python データ分析モジュールの「AWS Data Wrangler」がリリースされました.今回は普段 Python を使ってデータ分析の勉強をしているため,「AWS Data Wrangler」を公式ブログチュートリアルを参考に使ってみた所感を書いていきます.

aws.amazon.com

github.com

利用方法はドキュメントで確認していきましょう.

aws-data-wrangler.readthedocs.io

AWS Data Wrangler のメリット

AWS Data Wrangler」のメリットは下記の通りです.

  • AWS Data Wrangler」を利用することで, Athena や S3 の CSV データから Pandas を数行のコードで実現できる
  • PySpark から Redshift に連携できるため利用者は ETL(Extract/Transform/Load) に集中することが可能
    • AWS Data Wrangler」登場前は, ETL 処理にいくまでにサービスへの接続設定,各種コーディング必要だったが ETL 処理に集中していける

最大のメリットは, 利用者は ETL 処理に集中してコーディングを行える ことだと読み取れます.それでは実際に環境を作ってどれくらい簡単かをコーディングして確認していきます.

AWS Data Wrangler を使って ETL を行う

今回の環境は以下の画像の環境で,ブログで紹介された構成です.CSV を S3 に配置し,SageMaker から「AWS Data Wrangler」経由で Athena,S3 の CSVデータにアクセスした後,ETL 処理後の CSV データを S3 に出力するチュートリアルとなっています.

f:id:sadayoshi_tada:20191006114150p:plain 引用元: https://aws.amazon.com/jp/blogs/news/how-to-use-aws-data-wrangler/ シナリオの構成図より

1. S3 への CSV データをアップロード

まず,S3 へ CSV データをアップロードします.データは下記のGreen Taxi Trip Records(CSV) の1月データを使いました.

www1.nyc.gov

ローカルにダウンロードしたデータを S3 にアップロードします.

f:id:sadayoshi_tada:20191006115108p:plain

2. Athena でデータベースおよびテーブルを作成する

Athena でデータベースとテーブルを作成します.

# データベース作成
CREATE DATABASE greentripdata;

#テーブル作成
CREATE EXTERNAL TABLE green_tripdata(
  VendorID string, 
  lpep_pickup_datetime string,
  lpep_dropoff_datetime string,
  store_and_fwd_flag string,
  RatecodeID string,
  PULocationID string,
  DOLocationID string,
  passenger_count int,
  trip_distance double,
  fare_amount double,
  extra double,
  mta_max double,
  tip_amount double,
  tolls_amount double,
  ehail_fee string,
  improvement_surcharge double,
  total_amount double,
  payment_type string,
  trip_type string,
  congestion_surcharge double
  )
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LOCATION 's3://S3バケット名/CSV データ格納ディレクトリ/'; 

そして,後続でも使うためテーブルのデータ数を確認しておきます.630919 件のデータがあることを確認しました.

select count(*) from green_tripdata

f:id:sadayoshi_tada:20191006115522p:plain

3. SageMaker から AWS Data Wrangler 経由で Athena,S3 の CSVデータにアクセスする

SageMaker ノートブックインスタンス起動時に設定する IAM ロールにAmazonS3FullAccessAmazonAthenaFullAccessを付与しておきます.起動後に,「AWS Data Wrangler」モジュールをインストールします.

!pip install awswrangler

Collecting awswrangler
  Downloading https://files.pythonhosted.org/packages/ce/ab/677e5f5aa33584a6bacc15b7eaabea31f5ad7eb4e850a3105f5b73ebc99e/awswrangler-0.0.8.tar.gz
Collecting pyarrow>=0.14.0 (from awswrangler)
  Downloading https://files.pythonhosted.org/packages/c9/ed/e9fda0abcf087e0288ce78f744dffbfc2ac8dfba6f242a8ab025d76bee27/pyarrow-0.15.0-cp36-cp36m-manylinux1_x86_64.whl (60.1MB)
    100% |████████████████████████████████| 60.1MB 815kB/s eta 0:00:01
Collecting pandas>=0.25.1 (from awswrangler)
  Downloading https://files.pythonhosted.org/packages/73/9b/52e228545d14f14bb2a1622e225f38463c8726645165e1cb7dde95bfe6d4/pandas-0.25.1-cp36-cp36m-manylinux1_x86_64.whl (10.5MB)
    100% |████████████████████████████████| 10.5MB 7.8MB/s eta 0:00:01
Requirement already satisfied: botocore>=1.12.239 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from awswrangler) (1.12.239)
Requirement already satisfied: boto3>=1.9.239 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from awswrangler) (1.9.239)
Collecting s3fs>=0.3.4 (from awswrangler)
  Downloading https://files.pythonhosted.org/packages/01/5c/5899c874ac3a00c4b99be983eae22c8a3800c3d5fc3d22f6f1e5058aacf2/s3fs-0.3.4-py3-none-any.whl
Collecting tenacity>=5.1.1 (from awswrangler)
  Downloading https://files.pythonhosted.org/packages/1e/a1/be8c8610f4620c56790965ba2b564dd76d13cbcd7c2ff8f6053ce63027fb/tenacity-5.1.1-py2.py3-none-any.whl
Collecting pg8000>=1.13.2 (from awswrangler)
  Downloading https://files.pythonhosted.org/packages/16/32/ae895597e43bc968e0e3e63860e9932b851115457face0d06d7f451b71fc/pg8000-1.13.2-py3-none-any.whl
Requirement already satisfied: numpy>=1.14 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from pyarrow>=0.14.0->awswrangler) (1.14.3)
Requirement already satisfied: six>=1.0.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from pyarrow>=0.14.0->awswrangler) (1.11.0)
Requirement already satisfied: pytz>=2017.2 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from pandas>=0.25.1->awswrangler) (2018.4)
Requirement already satisfied: python-dateutil>=2.6.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from pandas>=0.25.1->awswrangler) (2.7.3)
Requirement already satisfied: urllib3<1.26,>=1.20; python_version >= "3.4" in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from botocore>=1.12.239->awswrangler) (1.23)
Requirement already satisfied: docutils<0.16,>=0.10 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from botocore>=1.12.239->awswrangler) (0.14)
Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from botocore>=1.12.239->awswrangler) (0.9.4)
Requirement already satisfied: s3transfer<0.3.0,>=0.2.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from boto3>=1.9.239->awswrangler) (0.2.1)
Collecting fsspec>=0.2.2 (from s3fs>=0.3.4->awswrangler)
  Downloading https://files.pythonhosted.org/packages/95/2c/31fce3889ce89ec13e47201c71a0cb6d2ff6e5c7b5fed066fe0ac5c5e22b/fsspec-0.5.1-py3-none-any.whl (56kB)
    100% |████████████████████████████████| 61kB 30.3MB/s ta 0:00:01
Collecting scramp==1.1.0 (from pg8000>=1.13.2->awswrangler)
  Downloading https://files.pythonhosted.org/packages/bb/ef/6bdba6756ba7ccb81187833504ebba0511af750a2d9beaa04e4b56c3974f/scramp-1.1.0-py3-none-any.whl
Building wheels for collected packages: awswrangler
  Running setup.py bdist_wheel for awswrangler ... done
  Stored in directory: /home/ec2-user/.cache/pip/wheels/d9/81/7d/f4e8f56f0d44f17a571fcbe5b90a4ceb6001d6debdf8951be9
Successfully built awswrangler
Installing collected packages: pyarrow, pandas, fsspec, s3fs, tenacity, scramp, pg8000, awswrangler
  Found existing installation: pandas 0.24.2
    Uninstalling pandas-0.24.2:
      Successfully uninstalled pandas-0.24.2
  Found existing installation: s3fs 0.1.5
    Uninstalling s3fs-0.1.5:
      Successfully uninstalled s3fs-0.1.5
Successfully installed awswrangler-0.0.8 fsspec-0.5.1 pandas-0.25.1 pg8000-1.13.2 pyarrow-0.15.0 s3fs-0.3.4 scramp-1.1.0 tenacity-5.1.1
You are using pip version 10.0.1, however version 19.2.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

AWS Data Wrangler」経由で Athena,S3 の CSVデータにアクセスしてデータの件数を確認してみます.2. Athena でデータベースおよびテーブルを作成するで確認したのと同じ630919件であることを確認できました.

import pandas as pd
import awswrangler

session = awswrangler.Session()
df = session.pandas.read_sql_athena(
    sql="select * from green_tripdata",
    database="greentripdata"
)

print(df)

【output】
       vendorid  lpep_pickup_datetime  lpep_dropoff_datetime  \
0       VendorID  lpep_pickup_datetime  lpep_dropoff_datetime   
1              2   2018-12-21 15:17:29    2018-12-21 15:18:57   
2              2   2019-01-01 00:10:16    2019-01-01 00:16:32   
3              2   2019-01-01 00:27:11    2019-01-01 00:31:38   
4              2   2019-01-01 00:46:20    2019-01-01 01:04:54   
...          ...                   ...                    ...   
630914         2   2019-01-31 23:08:27    2019-01-31 23:22:59   
630915         2   2019-01-31 23:21:26    2019-01-31 23:23:05   
630916         2   2019-01-31 23:30:05    2019-01-31 23:36:14   
630917         2   2019-01-31 23:59:58    2019-02-01 00:04:18   
630918         2   2019-01-31 23:18:22    2019-01-31 23:26:06   

        store_and_fwd_flag  ratecodeid  pulocationid  dolocationid  \
0       store_and_fwd_flag  RatecodeID  PULocationID  DOLocationID   
1                        N           1           264           264   
2                        N           1            97            49   
3                        N           1            49           189   
4                        N           1           189            17   
...                    ...         ...           ...           ...   
630914                   N           1           255           226   
630915                   N           1            75           151   
630916                   N           1            75           238   
630917                   N           1            74            74   
630918                   N           1            75           262   

        passenger_count  trip_distance  fare_amount  extra  mta_max  \
0                   NaN            NaN          NaN    NaN      NaN   
1                     5           0.00          3.0    0.5      0.5   
2                     2           0.86          6.0    0.5      0.5   
3                     2           0.66          4.5    0.5      0.5   
4                     2           2.68         13.5    0.5      0.5   
...                 ...            ...          ...    ...      ...   
630914                1           3.33         13.0    0.5      0.5   
630915                1           0.72          4.0    0.5      0.5   
630916                1           1.75          7.0    0.5      0.5   
630917                1           0.57          5.0    0.5      0.5   
630918                1           2.11          8.5    0.5      0.5   

        tip_amount  tolls_amount  ehail_fee  improvement_surcharge  \
0              NaN           NaN  ehail_fee                    NaN   
1             0.00           0.0        NaN                    0.3   
2             0.00           0.0        NaN                    0.3   
3             0.00           0.0        NaN                    0.3   
4             2.96           0.0        NaN                    0.3   
...            ...           ...        ...                    ...   
630914        2.14           0.0        NaN                    0.3   
630915        1.06           0.0        NaN                    0.3   
630916        0.00           0.0        NaN                    0.3   
630917        1.00           0.0        NaN                    0.3   
630918        1.96           0.0        NaN                    0.3   

        total_amount  payment_type  trip_type  congestion_surcharge  
0                NaN  payment_type  trip_type                   NaN  
1               4.30             2          1                   NaN  
2               7.30             2          1                   NaN  
3               5.80             1          1                   NaN  
4              19.71             1          1                   NaN  
...              ...           ...        ...                   ...  
630914         18.39             1          1                   0.0  
630915          6.36             1          1                   0.0  
630916          8.30             1          1                   0.0  
630917          7.30             1          1                   0.0  
630918         11.76             1          1                   0.0  

[630919 rows x 20 columns]

4. ETL 処理の実行

それでは ETL 処理の実行をしていきます.まず,trip_distanceカラムのデータが0の部分を分析対象外として行の削除処理を行います.削除する行は10721行であることを確認できます.

# trip_distanceが0の値を抽出
rows_drop = df.index[df["trip_distance"] == 0.00]
# trip_distanceが0の値の件数を確認
print(df.loc[rows_drop].count())

【output】
vendorid                 10721
lpep_pickup_datetime     10721
lpep_dropoff_datetime    10721
store_and_fwd_flag       10721
ratecodeid               10721
pulocationid             10721
dolocationid             10721
passenger_count          10721
trip_distance            10721
fare_amount              10721
extra                    10721
mta_max                  10721
tip_amount               10721
tolls_amount             10721
ehail_fee                    0
improvement_surcharge    10721
total_amount             10721
payment_type             10721
trip_type                10721
congestion_surcharge      1228
dtype: int64

trip_distanceカラムの0のデータ部分を削除していきます.総データ数が630919から10721行を削除するので,620198件のデータ削除処理しました.

# trip_distanceが0の値を削除
df_drop = df.drop(rows_drop)
print(df_drop)

【output】
        vendorid  lpep_pickup_datetime  lpep_dropoff_datetime  \
0       VendorID  lpep_pickup_datetime  lpep_dropoff_datetime   
2              2   2019-01-01 00:10:16    2019-01-01 00:16:32   
3              2   2019-01-01 00:27:11    2019-01-01 00:31:38   
4              2   2019-01-01 00:46:20    2019-01-01 01:04:54   
5              2   2019-01-01 00:19:06    2019-01-01 00:39:43   
...          ...                   ...                    ...   
630914         2   2019-01-31 23:08:27    2019-01-31 23:22:59   
630915         2   2019-01-31 23:21:26    2019-01-31 23:23:05   
630916         2   2019-01-31 23:30:05    2019-01-31 23:36:14   
630917         2   2019-01-31 23:59:58    2019-02-01 00:04:18   
630918         2   2019-01-31 23:18:22    2019-01-31 23:26:06   

        store_and_fwd_flag  ratecodeid  pulocationid  dolocationid  \
0       store_and_fwd_flag  RatecodeID  PULocationID  DOLocationID   
2                        N           1            97            49   
3                        N           1            49           189   
4                        N           1           189            17   
5                        N           1            82           258   
...                    ...         ...           ...           ...   
630914                   N           1           255           226   
630915                   N           1            75           151   
630916                   N           1            75           238   
630917                   N           1            74            74   
630918                   N           1            75           262   

        passenger_count  trip_distance  fare_amount  extra  mta_max  \
0                   NaN            NaN          NaN    NaN      NaN   
2                     2           0.86          6.0    0.5      0.5   
3                     2           0.66          4.5    0.5      0.5   
4                     2           2.68         13.5    0.5      0.5   
5                     1           4.53         18.0    0.5      0.5   
...                 ...            ...          ...    ...      ...   
630914                1           3.33         13.0    0.5      0.5   
630915                1           0.72          4.0    0.5      0.5   
630916                1           1.75          7.0    0.5      0.5   
630917                1           0.57          5.0    0.5      0.5   
630918                1           2.11          8.5    0.5      0.5   

        tip_amount  tolls_amount  ehail_fee  improvement_surcharge  \
0              NaN           NaN  ehail_fee                    NaN   
2             0.00           0.0        NaN                    0.3   
3             0.00           0.0        NaN                    0.3   
4             2.96           0.0        NaN                    0.3   
5             0.00           0.0        NaN                    0.3   
...            ...           ...        ...                    ...   
630914        2.14           0.0        NaN                    0.3   
630915        1.06           0.0        NaN                    0.3   
630916        0.00           0.0        NaN                    0.3   
630917        1.00           0.0        NaN                    0.3   
630918        1.96           0.0        NaN                    0.3   

        total_amount  payment_type  trip_type  congestion_surcharge  
0                NaN  payment_type  trip_type                   NaN  
2               7.30             2          1                   NaN  
3               5.80             1          1                   NaN  
4              19.71             1          1                   NaN  
5              19.30             2          1                   NaN  
...              ...           ...        ...                   ...  
630914         18.39             1          1                   0.0  
630915          6.36             1          1                   0.0  
630916          8.30             1          1                   0.0  
630917          7.30             1          1                   0.0  
630918         11.76             1          1                   0.0  

[620198 rows x 20 columns]

# trip_distanceが0の値の件数を確認
df_lens = df_drop.count()
print(df_lens)

【output】
vendorid                 620198
lpep_pickup_datetime     620198
lpep_dropoff_datetime    620198
store_and_fwd_flag       620198
ratecodeid               620198
pulocationid             620198
dolocationid             620198
passenger_count          620197
trip_distance            620197
fare_amount              620197
extra                    620197
mta_max                  620197
tip_amount               620197
tolls_amount             620197
ehail_fee                     1
improvement_surcharge    620197
total_amount             620197
payment_type             620198
trip_type                620198
congestion_surcharge      83310
dtype: int64

不要データを削除したものに対してデータ内のカラムの置き換えを行います.payment_typeという項目に対してデータの置き換えを行います.データの置き換えしたことで一部のみの表示ですがCredit cardに置き換わっていることを確認しました.

df_replace = df_drop.replace(
    {'payment_type': 
        {
            '1': 'Credit card', 
            '2': 'Cash', 
            '3': 'No charge', 
            '4': 'Dispute', 
            '5': 'Unknown', 
            '6': 'Voided trip'
        }
    }
)

print(df_replace['payment_type'])

【output】
0         payment_type
2                 Cash
3          Credit card
4          Credit card
5                 Cash
              ...     
630914     Credit card
630915     Credit card
630916     Credit card
630917     Credit card
630918     Credit card
Name: payment_type, Length: 620198, dtype: object

5. ETL 後のデータを別の CSV ファイルにして S3 に出力する

ETL 後のデータを別の CSV ファイルにして S3 に出力します.replace_csvフォルダに CSV データを出力します.S3 に2件のデータが出力されていることを確認しました.

session.pandas.to_csv(
    dataframe=df_replace,
    path="s3://xxxx/replace_csv/",
    sep=",",
    database=None,
    table=None,
    partition_cols=None,
    preserve_index=True, 
    mode='append',
    procs_cpu_bound=None, 
    procs_io_bound=None
)

【output】
['s3://xxxx/replace_csv/c379726f1d6d4b1b939fd64c730f059d.csv',
 's3://xxxxreplace_csv/febc156980ec4a0ea23a640558a3a596.csv']

f:id:sadayoshi_tada:20191006122354p:plain

出力後のデータの件数が行削除後のデータ件数かも確認します.620198のデータ件数であることを確認できました.一緒ですね.

df2 = session.pandas.read_sql_athena(
    sql="select * from green_tripdata_replace",
    database="greentripdata"
)

print(df2)

【output】
      vendorid lpep_pickup_datetime  lpep_dropoff_datetime  \
0       "315602"                  "2"  "2019-01-16 17:12:12"   
1       "315603"                  "2"  "2019-01-16 17:05:29"   
2       "315604"                  "2"  "2019-01-16 17:30:44"   
3       "315605"                  "2"  "2019-01-16 17:09:35"   
4       "315606"                  "2"  "2019-01-16 17:37:14"   
...          ...                  ...                    ...   
620193  "315597"                  "2"  "2019-01-16 18:00:02"   
620194  "315598"                  "2"  "2019-01-16 17:08:57"   
620195  "315599"                  "2"  "2019-01-16 17:29:20"   
620196  "315600"                  "2"  "2019-01-16 17:24:21"   
620197  "315601"                  "2"  "2019-01-16 18:01:00"   

           store_and_fwd_flag ratecodeid pulocationid dolocationid  \
0       "2019-01-16 17:28:05"        "N"          "1"         "74"   
1       "2019-01-16 17:13:48"        "N"          "1"         "95"   
2       "2019-01-16 17:44:44"        "N"          "5"        "134"   
3       "2019-01-16 17:16:01"        "N"          "1"        "130"   
4       "2019-01-16 17:46:56"        "N"          "1"        "130"   
...                       ...        ...          ...          ...   
620193  "2019-01-16 18:15:39"        "N"          "1"        "182"   
620194  "2019-01-16 17:17:41"        "N"          "1"         "75"   
620195  "2019-01-16 17:33:48"        "N"          "1"         "75"   
620196  "2019-01-16 17:56:35"        "N"          "1"         "97"   
620197  "2019-01-16 18:43:47"        "N"          "1"         "97"   

        passenger_count  trip_distance  fare_amount  extra  mta_max  \
0                   NaN            NaN          NaN    NaN      NaN   
1                   NaN            NaN          NaN    NaN      NaN   
2                   NaN            NaN          NaN    NaN      NaN   
3                   NaN            NaN          NaN    NaN      NaN   
4                   NaN            NaN          NaN    NaN      NaN   
...                 ...            ...          ...    ...      ...   
620193              NaN            NaN          NaN    NaN      NaN   
620194              NaN            NaN          NaN    NaN      NaN   
620195              NaN            NaN          NaN    NaN      NaN   
620196              NaN            NaN          NaN    NaN      NaN   
620197              NaN            NaN          NaN    NaN      NaN   

        tip_amount  tolls_amount ehail_fee  improvement_surcharge  \
0              NaN           NaN     "0.0"                    NaN   
1              NaN           NaN     "0.0"                    NaN   
2              NaN           NaN     "0.0"                    NaN   
3              NaN           NaN     "0.0"                    NaN   
4              NaN           NaN     "0.0"                    NaN   
...            ...           ...       ...                    ...   
620193         NaN           NaN     "0.0"                    NaN   
620194         NaN           NaN     "0.0"                    NaN   
620195         NaN           NaN     "0.0"                    NaN   
620196         NaN           NaN     "0.0"                    NaN   
620197         NaN           NaN     "0.0"                    NaN   

        total_amount payment_type      trip_type  congestion_surcharge  
0                NaN      "16.62"  "Credit card"                   NaN  
1                NaN        "9.8"         "Cash"                   NaN  
2                NaN      "18.02"  "Credit card"                   NaN  
3                NaN       "9.36"  "Credit card"                   NaN  
4                NaN      "11.16"  "Credit card"                   NaN  
...              ...          ...            ...                   ...  
620193           NaN       "15.3"  "Credit card"                   NaN  
620194           NaN        "9.8"         "Cash"                   NaN  
620195           NaN       "8.76"  "Credit card"                   NaN  
620196           NaN       "23.3"  "Credit card"                   NaN  
620197           NaN       "34.8"         "Cash"                   NaN  

[620198 rows x 20 columns]

まとめ

リリースされた Python データ分析モジュールの「AWS Data Wrangler」のチュートリアルを行なってみました.Pandas で CSV を読み書きするときに JupyterNotebook の実行環境のローカルに配置して処理していましたが,S3 や Athena に接続設定などを書かずにローカルに ETL 処理対象があるかのようにデータを扱えた印象でした.本モジュールのメリットにあるように ETL 処理に集中していくことが可能なのかと感じます.AWS のデータ解析のエコシステムを作るときに登場してくる存在として今後のアップデートに注目していきたいですし,採用も検討していきたいですね!