Quantcast
Channel: 技術 –サーバーワークスエンジニアブログ
Viewing all 1210 articles
Browse latest View live

[2019/9/11版] 東京リージョンで構築可能なインスタンスタイプのアベイラビリティーゾーン別一覧表

$
0
0

CS課佐竹です。
こちらの記事は以前2019年4月10日に投稿させて頂きました記事「[EC2]東京リージョンで構築可能なインスタンスタイプのアベイラビリティーゾーン別一覧表」の更新版となります。

はじめに

今回は東京リージョンにA1のインスタンスタイプが対応しましたのでそのための追記となります。

Amazon EC2 A1 インスタンスをご利用いただけるリージョンが増えました
https://aws.amazon.com/jp/about-aws/whats-new/2019/08/amazon-ec2-a1-instances-are-now-available-in-additional-regions/

これを受け、実際に東京リージョンのどのAZが対応済なのか確認しました。他にも以下のリリースが確認できます。

Amazon EC2 C5 の新しいインスタンスサイズをご利用いただけるリージョンが増えました
https://aws.amazon.com/jp/about-aws/whats-new/2019/08/amazon-ec2-c5-new-instance-sizes-are-now-available-in-additional-regions/

補足となりますが、「前回の2019/6/27版」と同様に「こちら」の公式ドキュメントの英語版に記載があるInstance Typeの一覧が、それぞれ東京リージョンの全アベイラビリティーゾーン(AZ)で構築が可能か「aws ec2 run-instances」の –dry-run オプションを利用して確認します。詳しくは「[EC2]東京リージョンで構築可能なインスタンスタイプのアベイラビリティーゾーン別一覧表」をご覧ください。

結果(アベイラビリティーゾーン別一覧表)

以下に結果を表示します。なお以下に存在していない「apne1-az3」は、現在Subnetの作成もできないクローズされたアベイラビリティーゾーンですので、結果からは省いております。また「前回の2019/6/27版」との差分は赤字で示しております。

Instance Type 1a (apne1-az4) 1c (apne1-az1) 1d (apne1-az2)
a1.medium 成功 他のAZで構築可能 成功
a1.large 成功 他のAZで構築可能 成功
a1.xlarge 成功 他のAZで構築可能 成功
a1.2xlarge 成功 他のAZで構築可能 成功
a1.4xlarge 成功 他のAZで構築可能 成功
m4.large 成功 成功 成功
m4.xlarge 成功 成功 成功
m4.2xlarge 成功 成功 成功
m4.4xlarge 成功 成功 成功
m4.10xlarge 成功 成功 成功
m4.16xlarge 成功 成功 成功
m5.large 成功 成功 成功
m5.xlarge 成功 成功 成功
m5.2xlarge 成功 成功 成功
m5.4xlarge 成功 成功 成功
m5.8xlarge 成功 成功 成功
m5.12xlarge 成功 成功 成功
m5.16xlarge 成功 成功 成功
m5.24xlarge 成功 成功 成功
m5.metal 成功 成功 成功
m5a.large 成功 他のAZで構築可能 成功
m5a.xlarge 成功 他のAZで構築可能 成功
m5a.2xlarge 成功 他のAZで構築可能 成功
m5a.4xlarge 成功 他のAZで構築可能 成功
m5a.8xlarge 成功 他のAZで構築可能 成功
m5a.12xlarge 成功 他のAZで構築可能 成功
m5a.16xlarge 成功 他のAZで構築可能 成功
m5a.24xlarge 成功 他のAZで構築可能 成功
m5ad.large 東京Region未対応 東京Region未対応 東京Region未対応
m5ad.xlarge 東京Region未対応 東京Region未対応 東京Region未対応
m5ad.2xlarge 東京Region未対応 東京Region未対応 東京Region未対応
m5ad.4xlarge 東京Region未対応 東京Region未対応 東京Region未対応
m5ad.12xlarge 東京Region未対応 東京Region未対応 東京Region未対応
m5ad.24xlarge 東京Region未対応 東京Region未対応 東京Region未対応
m5d.large 成功 成功 成功
m5d.xlarge 成功 成功 成功
m5d.2xlarge 成功 成功 成功
m5d.4xlarge 成功 成功 成功
m5d.8xlarge 成功 成功 成功
m5d.12xlarge 成功 成功 他のAZで構築可能
m5d.16xlarge 成功 成功 成功
m5d.24xlarge 成功 成功 成功
m5d.metal 成功 成功 成功
t2.nano 成功 成功 成功
t2.micro 成功 成功 成功
t2.small 成功 成功 成功
t2.medium 成功 成功 成功
t2.large 成功 成功 成功
t2.xlarge 成功 成功 成功
t2.2xlarge 成功 成功 成功
t3.nano 成功 成功 成功
t3.micro 成功 成功 成功
t3.small 成功 成功 成功
t3.medium 成功 成功 成功
t3.large 成功 成功 成功
t3.xlarge 成功 成功 成功
t3.2xlarge 成功 成功 成功
t3a.nano 成功 他のAZで構築可能 成功
t3a.micro 成功 他のAZで構築可能 成功
t3a.small 成功 他のAZで構築可能 成功
t3a.medium 成功 他のAZで構築可能 成功
t3a.large 成功 他のAZで構築可能 成功
t3a.xlarge 成功 他のAZで構築可能 成功
t3a.2xlarge 成功 他のAZで構築可能 成功
c4.large 成功 成功 成功
c4.xlarge 成功 成功 成功
c4.2xlarge 成功 成功 成功
c4.4xlarge 成功 成功 成功
c4.8xlarge 成功 成功 成功
c5.large 成功 成功 成功
c5.xlarge 成功 成功 成功
c5.2xlarge 成功 成功 成功
c5.4xlarge 成功 成功 成功
c5.9xlarge 成功 成功 成功
c5.12xlarge 成功 成功 成功
c5.18xlarge 成功 成功 成功
c5.24xlarge 成功 成功 成功
c5.metal 成功 成功 成功
c5d.large 成功 成功 成功
c5d.xlarge 成功 成功 成功
c5d.2xlarge 成功 成功 成功
c5d.4xlarge 成功 成功 成功
c5d.9xlarge 成功 成功 成功
c5d.18xlarge 成功 成功 成功
c5n.large 成功 他のAZで構築可能 成功
c5n.xlarge 成功 他のAZで構築可能 成功
c5n.2xlarge 成功 他のAZで構築可能 成功
c5n.4xlarge 成功 他のAZで構築可能 成功
c5n.9xlarge 成功 他のAZで構築可能 成功
c5n.18xlarge 成功 他のAZで構築可能 成功
r4.large 成功 成功 成功
r4.xlarge 成功 成功 成功
r4.2xlarge 成功 成功 成功
r4.4xlarge 成功 成功 成功
r4.8xlarge 成功 成功 成功
r4.16xlarge 成功 成功 成功
r5.large 成功 成功 成功
r5.xlarge 成功 成功 成功
r5.2xlarge 成功 成功 成功
r5.4xlarge 成功 成功 成功
r5.8xlarge 成功 成功 成功
r5.12xlarge 成功 成功 成功
r5.16xlarge 成功 成功 成功
r5.24xlarge 成功 成功 成功
r5.metal 成功 成功 成功
r5a.large 成功 他のAZで構築可能 成功
r5a.xlarge 成功 他のAZで構築可能 成功
r5a.2xlarge 成功 他のAZで構築可能 成功
r5a.4xlarge 成功 他のAZで構築可能 成功
r5a.8xlarge 成功 他のAZで構築可能 成功
r5a.12xlarge 成功 他のAZで構築可能 成功
r5a.16xlarge 成功 他のAZで構築可能 成功
r5a.24xlarge 成功 他のAZで構築可能 成功
r5ad.large 東京Region未対応 東京Region未対応 東京Region未対応
r5ad.xlarge 東京Region未対応 東京Region未対応 東京Region未対応
r5ad.2xlarge 東京Region未対応 東京Region未対応 東京Region未対応
r5ad.4xlarge 東京Region未対応 東京Region未対応 東京Region未対応
r5ad.12xlarge 東京Region未対応 東京Region未対応 東京Region未対応
r5ad.24xlarge 東京Region未対応 東京Region未対応 東京Region未対応
r5d.large 成功 成功 成功
r5d.xlarge 成功 成功 成功
r5d.2xlarge 成功 成功 成功
r5d.4xlarge 成功 成功 成功
r5d.8xlarge 成功 成功 成功
r5d.12xlarge 成功 成功 成功
r5d.16xlarge 成功 成功 成功
r5d.24xlarge 成功 成功 成功
r5d.metal 成功 成功 成功
u-6tb1.metal 東京Region未対応 東京Region未対応 東京Region未対応
u-9tb1.metal 東京Region未対応 東京Region未対応 東京Region未対応
u-12tb1.metal 東京Region未対応 東京Region未対応 東京Region未対応
x1.16xlarge 上限緩和申請が必要 上限緩和申請が必要 上限緩和申請が必要
x1.32xlarge 上限緩和申請が必要 上限緩和申請が必要 上限緩和申請が必要
x1e.xlarge 成功 成功 他のAZで構築可能
x1e.2xlarge 成功 成功 他のAZで構築可能
x1e.4xlarge 成功 成功 他のAZで構築可能
x1e.8xlarge 上限緩和申請が必要 上限緩和申請が必要 他のAZで構築可能
x1e.16xlarge 上限緩和申請が必要 上限緩和申請が必要 他のAZで構築可能
x1e.32xlarge 上限緩和申請が必要 上限緩和申請が必要 他のAZで構築可能
z1d.large 成功 成功 成功
z1d.xlarge 成功 成功 成功
z1d.2xlarge 成功 成功 成功
z1d.3xlarge 成功 成功 成功
z1d.6xlarge 成功 成功 成功
z1d.12xlarge 成功 成功 成功
z1d.metal 成功 成功 成功
d2.xlarge 成功 成功 成功
d2.2xlarge 成功 成功 成功
d2.4xlarge 成功 成功 成功
d2.8xlarge 成功 成功 成功
h1.2xlarge 東京Region未対応 東京Region未対応 東京Region未対応
h1.4xlarge 東京Region未対応 東京Region未対応 東京Region未対応
h1.8xlarge 東京Region未対応 東京Region未対応 東京Region未対応
h1.16xlarge 東京Region未対応 東京Region未対応 東京Region未対応
i3.large 成功 成功 成功
i3.xlarge 成功 成功 成功
i3.2xlarge 成功 成功 成功
i3.4xlarge 成功 成功 成功
i3.8xlarge 成功 成功 成功
i3.16xlarge 成功 成功 成功
i3.metal 成功 成功 成功
i3en.large 成功 他のAZで構築可能 成功
i3en.xlarge 成功 他のAZで構築可能 成功
i3en.2xlarge 成功 他のAZで構築可能 成功
i3en.3xlarge 成功 他のAZで構築可能 成功
i3en.6xlarge 成功 他のAZで構築可能 成功
i3en.12xlarge 成功 他のAZで構築可能 成功
i3en.24xlarge 成功 他のAZで構築可能 成功
f1.2xlarge 東京Region未対応 東京Region未対応 東京Region未対応
f1.4xlarge 東京Region未対応 東京Region未対応 東京Region未対応
f1.16xlarge 東京Region未対応 東京Region未対応 東京Region未対応
g3s.xlarge 成功 成功 他のAZで構築可能
g3.4xlarge 成功 成功 他のAZで構築可能
g3.8xlarge 成功 成功 他のAZで構築可能
g3.16xlarge 成功 成功 他のAZで構築可能
p2.xlarge 成功 成功 他のAZで構築可能
p2.8xlarge 成功 成功 他のAZで構築可能
p2.16xlarge 上限緩和申請が必要 上限緩和申請が必要 他のAZで構築可能
p3.2xlarge 成功 成功 他のAZで構築可能
p3.8xlarge 成功 成功 他のAZで構築可能
p3.16xlarge 上限緩和申請が必要 上限緩和申請が必要 他のAZで構築可能
p3dn.24xlarge 成功 他のAZで構築可能 他のAZで構築可能
m1.small 成功 成功 他のAZで構築可能
m1.medium 成功 成功 他のAZで構築可能
m1.large 成功 成功 他のAZで構築可能
m1.xlarge 成功 成功 他のAZで構築可能
m3.medium 成功 成功 他のAZで構築可能
m3.large 成功 成功 他のAZで構築可能
m3.xlarge 成功 成功 他のAZで構築可能
m3.2xlarge 成功 成功 他のAZで構築可能
t1.micro 成功 成功 他のAZで構築可能
c1.medium 成功 成功 他のAZで構築可能
c1.xlarge 成功 成功 他のAZで構築可能
cc2.8xlarge 成功 成功 他のAZで構築可能
c3.large 成功 成功 他のAZで構築可能
c3.xlarge 成功 成功 他のAZで構築可能
c3.2xlarge 成功 成功 他のAZで構築可能
c3.4xlarge 成功 成功 他のAZで構築可能
c3.8xlarge 成功 成功 他のAZで構築可能
m2.xlarge 成功 成功 他のAZで構築可能
m2.2xlarge 成功 成功 他のAZで構築可能
m2.4xlarge 成功 成功 他のAZで構築可能
cr1.8xlarge 東京Region未対応 東京Region未対応 東京Region未対応
r3.large 成功 成功 他のAZで構築可能
r3.xlarge 成功 成功 他のAZで構築可能
r3.2xlarge 成功 成功 他のAZで構築可能
r3.4xlarge 成功 成功 他のAZで構築可能
r3.8xlarge 成功 成功 他のAZで構築可能
hs1.8xlarge 東京Region未対応 東京Region未対応 東京Region未対応
i2.xlarge 成功 成功 他のAZで構築可能
i2.2xlarge 成功 成功 他のAZで構築可能
i2.4xlarge 成功 成功 他のAZで構築可能
i2.8xlarge 成功 成功 他のAZで構築可能
g2.2xlarge 成功 成功 他のAZで構築可能
g2.8xlarge 成功 成功 他のAZで構築可能

前回からの変更点

上記の赤字の通り、本日までのリリース分で更新がありました。まず c5.12xlarge、c5.24xlarge、c5.metal インスタンスが全てのAZで利用可能になっております。しかし、a1 ファミリーのインスタンスは、AZ-1cでは未対応でした。念のためご留意ください。

少々疑問なのは「m5d.12xlarge」が1dで構築ができない点です。何故か m5d.12xlarge だけ、1dでは何度CLIを実行しても下記のエラーとなりました。

An error occurred (Unsupported) when calling the RunInstances operation: Your requested instance type (m5d.12xlarge) is not supported in your requested Availability Zone (ap-northeast-1d). Please retry your request by not specifying an Availability Zone or choosing ap-northeast-1c, ap-northeast-1a.

このエラーの通りであれば、現在は m5d.12xlarge は ap-northeast-1d で構築できないということになります。不思議ですね。

まとめ

今回と前回の更新を踏まえ、各AZの特徴を再度まとめてみましょう。

  • 旧世代のインスタンスタイプは、東京リージョンの1dでは構築できない
  • m5dとc5d、z1d、x1eについては東京リージョンの1dでは構築できない
  • a1とt3a、m5a、r5a、c5n、i3enについては東京リージョンの1cでは構築できない

またもさくっとした更新でしたが、参考になりましたら幸いです。
それではまたお会いしましょう。


Snowball Edgeを利用したAWSへのデータ移行 -2019夏-

$
0
0

 

技術2課のタムラです。

日本のとある場所では最高40度だとかを記録しているような茹だるような猛暑の中
とあるお客様と一緒にSnowball Edgeを利用したシステムのデータ移行を実施してきました。
いわゆる「真夏の雪遊び」ってやつです。

ありがたい事に今回、お客様にご協力頂けましたので実際の作業の流れやら物理機器の様子など
Snowball Edgeを利用したデータ移行の一連の流れの雰囲気やら注意点をblogでお伝えできればと思います。

Snowball Edgeとは、Snowballの機能拡張版です。
Snowballと Snowball Edgeの違いは以下URIに綺麗にまとまっているので興味があれば確認してください。
https://docs.aws.amazon.com/ja_jp/snowball/latest/ug/device-differences.html

Snowball Edgeは、Snowballと違い筐体中にコンピューティングの機能を持ち
処理負荷の高いデータ暗号化処理等をSnowball Edge本体のリソースにて実施することができます。

従ってデータ移行を計画し、移行環境を整える必要があるユーザ側の視点だと
Snowballの場合は、Clientにかなりパワフルなスペックやら台数が要求される場合があるが
Snowball Edgeの場合は、Clientにそれほどのスペックは要求されない(*1)というのが
一番抑えておきたいポイントだと思います。
*1…ただしスペックは高いに越した事はない(後述)

また別途費用はかかりますが、Snowball Edgeの中でEC2をローンチして仮想サーバーを動かすというな事もでき、そのEC2インスタンスを Snowball Edge Clientとして利用する事も可能です。持ち運び可能なAWSのデータセンターみたいな感じですね。
詳細については最新のBlackbeltを参照頂くのが良いと思われます。

今回のデータ移行計画について

オンプレミス環境のシステムで利用されていた約30TBのアーカイブデータが今回の移行対象でした。
オンプレミスのサーバーはAWSへ移行し退役済みですが、アーカイブデータだけ物理のNAS装置に残された状態で、それらをS3へ速やかに移行するというのが今回のミッションでした。

本番で利用されているネットワークを利用したオンラインでの移行も検討しましたが、やはりテラバイトクラスのデータを他業務に影響が出ないよう帯域制御をかけながら細々とやるとなるとなると完了まで数年とか平気で要してしまうような状況であった事と、お客様にてパワフルなClient PCを用意することが難しかった事もあり、サーバーワークスとして今回Snowball Edgeを活用したデータ移行を提案しました。

データ移行環境の構成について

今回構築したデータ移行環境のイメージ図は以下です。

お客様の会社ポリシーでSnowball EdgeおよびClient PCのインターネット接続(遠隔操作)は、許可されない状況でしたので、データ移行を目的とした閉ざされたLAN環境となります。
朱書きの線は今回のデータ移行ではボトルネック(1GbE使い切り)となった箇所となり、もし用意可能であれば10GbEでの接続が好ましいと思われた箇所です。

データ移行元の対象機器は非ラックマウント型のQNAPのNAS装置*2で、現役時は社内のWindows Clientからネットワークドライブとしてエクスプローラー経由でデータ参照/更新の運用がされていたものでした。NAS装置(NASヘッド)が物理的に2つに分かれ、それぞれにUSB-HDD(一部USB2.0接続のためバスがボトルネックとなる)が容量拡張目的でぶら下がっているような構成でした。

移行元データの特徴

今回の移行元は業務システムで利用されていたアーカイブデータが主となり、数10MB-数GBのバイナリデータが多く1ファイルの平均サイズが大きめな点が特徴でした。

データ容量 約30TB (30,228 GB)
ファイル数 1,731,346
ディレクトリ数 48,873
1ファイル平均サイズ 17.88 MB
1ディレクトリあたりの平均ファイル数 35.43

Snowball Edgeのジョブ作成の前に

Snowball Edgeのジョブ作成へ進む前に実施した方が良い事前準備や調整事項について先に紹介します。

1.S3の仕様とデータ移行時の注意点の把握

S3はキーバリュー型のオブジェクトストレージでディレクトリ(=フォルダ)といった概念がありません。なのでもし移行元にいわゆる空ディレクトリのようなディレクトリ配下に何もファイルが存在しないものがあった場合、そのディレクトリはデータ移行されません。

もし、空ディレクトリのデータ移行がどうしても必要な場合は、例えばスクリプト等で空ディレクトリの配下にダミーファイルを作成する等、事前に考慮が必要となります。

もう一点、S3側の制約やら何らかの問題でデータ移行が失敗し、手動でのデータ移行が必要となる場合がある事を認識し、もし失敗した場合の対応方針についても検討しておく必要があります。

例えば、S3の禁則文字であれば以下URIの以下項目を参照
・特殊な処理を必要とする可能性がある文字
・使用しない方がよい文字
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingMetadata.html

2.データ移行先の S3 bucketの決定および作成

今回のようなデータ移行をする場合、ジョブ作成時に移行先の S3 bucketの指定が必要となりますので事前に検討および作成が必要です。

S3 bucketへのインポートする際の権限周りの設定は Snowball Edgeジョブ作成時に作成しますので単純にS3 bucketを作成するだけで問題ありません。
特別なポリシーでも無い限り、AWSによるインポートが完了するまではS3 bucketの設定はデフォルトからいじらない方が無難と思われます。

3.移行元のデータ傾向の分析

移行元のデータの傾向は、データ転送のパフォーマンスだけでなくClinetにも影響がありますので事前に分析しておく事は重要です。
ファイル数が大量かつ平均ファイルサイズがとても小さい傾向の場合、Client PC側でバッチ処理(tarで固めつつ転送する処理)を実施する事が推奨されます。
その為、ClientにパワフルなスペックのLinux OSの端末が必要となります。

(今回は平均サイズがかなり大きかったのと、Windowsのマシンしか調達出来なかった都合で Windows OSを利用し実施しました)

4.データ移行進捗の把握方法

Snowball Edge Clientを遠隔操作出来る場合はコマンドから確認する事ができますが、今回のように遠隔操作が許可されない環境の場合、データ移行進捗は現地で Snowball Edgeのフロントパネルに表示されているインジケータから進捗を確認し、想定残り時間等はユーザの方で算出するしかありません。

従ってSnowball Edge設置先での目視確認方法について考慮する必要があります。

5.課金体系とデータ移行所要時間の見積もり

201908時点で 100TBのSnowball Edgeの場合、リージョンによっても異なりますがジョブ作成(物理機器手配)で$300と、届いた翌日から10日間までは無料ですが11日目以降は一日あたり$30の課金が発生します。

料金の詳細は以下URIを参照
https://aws.amazon.com/jp/snowball-edge/pricing/

従って、Snowball Edgeを利用したデータ移行の計画を立てる場合は、コストの考慮をし不用意に長く機器を拘束してしまう事がないよう、過去事例などを参考に実環境でのデータインポートの想定時間を算出することが重要です。

今回は、Web上で公開されている他事例から今回の構成に近い内容を探し、同じ1Gbpsの環境でSnowball Edgeで AWS CLI(S3 Adapter経由)を利用して1GBを22secのレートで転送出来ていたとの情報を参考に推定所要時間の見積もりをしてから前に進みました。

22sec * 30,228GB = 665,016 sec = 11,083.6 min = 184.73 hours = 7.69 days

(上の例では1ファイル1MBの例でしたので、今回の場合は1ファイルあたり平均17.88MBとかなり大きい事とNAS Headが2つでしたので倍ぐらい良いパフォーマンスが出る=1Gbps使い切れる可能性が高いと期待も添えておきましたが)

6.纏めますと

以下情報をきちんとお客様へ事前に説明し合意を得てからジョブ作成(機器手配)へと進むのがトラブルが少なく良いでしょう。

  • S3の仕様や制約(空ディレクトリの取り扱い、禁則文字列等)について
  • 何らかの原因で移行が失敗したデータの対応方針
  • データ格納先のS3 bucketとデータの配置イメージ
  • 移行元のデータ分析とその結果から用意すべきClient PCについて(傾向によってはLinux OS必須)
  • データ移行進捗の確認方法 (遠隔操作可能であれば不要)
  • Snowball Edge の11日目以降に発生する課金について
  • データ移行環境での想定データ転送速度
  • 想定データ転送速度が出た場合の想定データ移行所要時間
  • 想定のパフォーマンスが出なかった場合のアクションプラン

Snowball Edgeジョブ作成

それでは実際に、Snowball Edgeのジョブ作成を行います。
「ジョブ」とはなんぞや?という話ですが、Snowball Edgeの機器手配からインポート完了までの一連の作業が1つの「ジョブ」として管理され、AWSマネージドコンソールでもステータスが可視化されます。実際に画面を眺めた方がイメージが伝わると思いますので続けて見ていきましょう。

I.AWSマネージドコンソソールから AWS Snowballの画面より ジョブの作成を押下

II.ジョブの計画を選択
 今回はAWS(S3)へのデータ移行の為、「Amazon S3へのインポート」を選択します。

III.お届け先の情報を入力
 Snowball Edgeの配送先住所を入力します。

IV.ジョブの詳細の入力
 「ジョブ名」は、AWS管理者が管理しやすいお好きな名前を指定で問題ありません。
 どのデータ移行の為のジョブなのかが明確となるよう案件名やらシステム名やらデータ移行プロ ジェクト名などを設定するのが一般的に良いと思われます。

V.インポートジョブのデバイスの選択
 続けて同じ画面で、Snowballか Snowball Edgeか、はたまたCPUやGPUが強化された Snowball Edgeが選択できるので要件にあったデバイスを選択します。

VI.ストレージ
 続けて同じ画面でデータ移行先の S3 bucketを選択します。

VII.セキュリティの設定
 アクセス権限の箇所にて [IAMロールの作成/選択] を押下し、snowball-import-s3-only-role の利用を許可します。
 (Snowball Edgeが当該アカウントのS3 bucketへのインポートする際に必要な権限を許可するイメージです)

[IAMロールの作成/選択]を押下後に以下を許可します。

VIII.暗号化
 続けて、利用するデータ暗号化で利用するKMSキーを指定します。
 特別な要件でもない限り、デフォルトのKMSキーで問題ないと思われます。

IX.通知の設定
 Amazon SNSにてジョブステータス変更時にEmail通知を飛ばす設定を実施します。

Emailアドレスはカンマ等で区切り複数指定が可能です。今回はお客様とサーバーワークスの案件関係者を複数指定しました。

Subject:AWS Notification - Subscription Confirmation の Emailが指定した先に届くので Confirm subscriptionを実行すると以後、配送されたタイミングやインポート開始時等のジョブステータス変更時にEmailの通知を受け取ることができます。

X.最終確認画面にて内容を確認し、[ジョブの作成]を押下したら作業完了です。
(一応ジョブ作成から1h以内であれば料金発生せずにキャンセル可能です)

一連の作業の流れが下のインジケータで表現されており、Snowball Edgeが今どのようなステータスなのかをジョブダッシュボードから簡単に確認する事が出来ます。
あとはSnowball Edgeの機器が到着するまで待ちましょう。

Snowball Edge Clientの設定

Snowball Edgeの機器が到着するまで事前準備として、Client PCの環境を整備しておくと良いでしょう。今回利用した Client PCは以下スペックです。
(実は最初にお客様に用意頂いた機器でH/Wトラブルがあり急遽サーバーワークス内で余っていた代替機のノートPCを急遽手配しました)

OS Windows10 Pro(64bit)
CPU Intel Core i3-7130U (2.70GHz 2133MHz 3MB)
MEM 8.0GB
NIC 1GbE

A.Snowball Edge Clientの導入
 以下からインストーラーを入手し導入します。
 Windowsの場合は、コマンドプロンプトから snowballEdge コマンドを打てるようになればOKです。
https://aws.amazon.com/jp/snowball-edge/resources/

B.Pythonの導入
 AWS CLIを導入する目的でPythonを導入します。
https://www.python.org/

C.AWS CLIの導入
 AWS CLIを導入します。
 今回の場合、以下ドキュメントに従い1.16.14 を導入しました。
https://docs.aws.amazon.com/ja_jp/snowball/latest/developer-guide/using-adapter.html

機器の受け取り

配送業者よりSnowball Edgeを受け取ります。
ダンボール等で梱包されている訳ではなく本体がそのまま輸送されてきます。

到着したSnowball Edgeさん

無骨なボディでかっこいいです!
いかにも頑丈で断熱しそうな素材で覆われているので雪のように冷たくはありません。
HDDの塊のようなものでもあるのですが、22.45kgと見た目やサイズの割には重たくはないですし、
パラレルグリップみたいなハンドルがついているので一般男性であれば運搬もそこまで苦ではないと思われます。
(サーバーワークス東京本社のリフレッシュルームに設置されているダンベルの方が重たいです)

おもむろに上のカバーを開けると電源ケーブル(日本で一般的なアースありのAタイプ)が入っています。

おもむろに前のカバーを開けると電源ボタンと固定されたタブレット(Fire)のモニターが現れます。

おもむろに後ろのカバーを開けるとRJ45(10G Base-T)、SFP+(25G)、QSFP+(40G)、USB3.0*2(非データ移行用)といった相当たるインターフェース群が現れます。

おもむろに電源ケーブルを差し込むと同時に電源がONとなり、
「ゔぼぉぉぉぉぉ」とやや低くて渋いサウンド(HP DLシリーズ比)を奏でながら起動してきます。
こんな音量でずっと動くのか・・・?と最初驚きましたが、
起動時の30-40sec程度ファンが100%で周り続けるだけで、その後は静かに落ち着きました。

フロントパネルを見るとFireの起動画面 -> Snowball Edgeにようこそ的な動画 -> トップ画面に遷移します。
トップ画面のメニュータブは「EDGE , CONNECTION , HELP」の3つとシンプルな構成です。

早速、Snowball Edgeに利用するIPアドレスを付与します。
「CONNECTION」を選択すると利用するインタフェースの選択タブとネットワーク設定の入力フォームおよびソフトウェアキーボードが現れるので設定します。スマートフォンをいじっている感覚で設定出来るので簡単、便利ですね。

IPアドレスの設定が完了すると上面のE-inkの情報にも反映されるようです。(初期状態だと 0.0.0.0 と表示されていました)

設定が完了したら、LANケーブル(今回はRJ45)を接続します。
このタイミングで同セグに接続したClient PCから Snowball Edgeに付与したIPアドレス宛にPingでの疎通確認を実施しておくと良いでしょう。

Snowball Edgeの Unlock

Snowball Edgeの利用を開始するためには、まずはUnlock作業を実施する必要があります。

Unlockに必要な情報として以下2点が必要となり、両方ともジョブが有効かつSnowball Edge本体が利用者の元にあるステータスの間のみジョブダッシュボードの認証情報から取得が可能です。

(1)マニフェストファイル  (XXXはSnowball EdgeのデバイスID)
   XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_manifest-1.bin
   ダウンロードして Snowball Edge Client が参照出来る場所に保存してください。

(2)クライアント解除コード (YYYはランダムな英数字)
 YYYYY-YYYYY-YYYYY-YYYYY-YYYYY

準備ができたらSnowball Edge Clint導入済みのClient PCから Unlockコマンドを実行します。
マニフェストファイルをデスクトップ(C:\Users\LocalAdmin\Desktop\)に置いた場合は以下のようなコマンドになります。

C:\Users\LocalAdmin>snowballEdge unlock-device --endpoint https://192.168.0.10 --manifest-file C:\Users\LocalAdmin\Desktop\XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_manifest-1.bin --unlock-code YYYYY-YYYYY-YYYYY-YYYYY-YYYYY
Your Snowball Edge device is unlocking. You may determine the unlock state of your device using the describe-device command. Your Snowball Edge device will be available for use when it is in the UNLOCKED state.

Unlockが完了すると フロントパネルの Amazon S3がUnlockingと表示され、しばらくすると Ready となり消費容量のインジケータが表示されます。

今回の場合、いきなり4.5TB消費しており、しかも容量が徐々に増えていくので、お客様と二人で「えっ」ってなったのですがこれで正常なようです。
起動後1時間程度で、初期消費容量が5TBぴったりで落ち着きました。(何が入っていてどんな処理がされていたのか少し気になります…)
とりあえず、この初期消費容量の値を基準にてデータ移行の進捗を把握する必要があるので数値を控えておくと良いと思います。

ここで「何故にServices に Amazon S3?」と思った方がいるかもしれませんが、Snowball Edgeでは仮想でAWSのS3のサービスのようなものが動作しており、利用者視点だとSnowball Edge内にまるでデータ移行先のS3のbucketが存在しているかのように見えます。なのでジョブ作成時に指定した S3 bucketのURIに対して後にAWS CLIでコマンドを発行する事となります。

初期の状態だとUnlock後に、Snowball Edgeコマンドを打つたび、いちいちマニフェストファイル等の指定が求められて大変なのでデータ移行期間中は、snowballEdge configure コマンドにて対話式にconfigファイルを作成しておくと便利です。

C:\Users\LocalAdmin>snowballEdge configure
Configuration will stored at C:\Users\LocalAdmin\.aws\snowball\config\snowball-edge.config
Snowball Edge Manifest Path: C:\Users\LocalAdmin\Desktop\XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_manifest-1.bin
Unlock Code:  YYYYY-YYYYY-YYYYY-YYYYY-YYYYY
Default Endpoint: https://192.168.0.10

C:\Users\LocalAdmin>

これで、Snowball Edgeコマンドが不自由なく利用出来るようになりました。
例えば、デバイスステータスを表示するコマンドを叩くと以下のような結果が返ってきます。
(マークした L35,36の値を使えばフロントパネルのインジケータを見ずに進捗を把握が出来そうですね)

C:\Users\LocalAdmin>snowballEdge describe-device
{
"DeviceId" : "XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"UnlockStatus" : {
"State" : "UNLOCKED"
},
"ActiveNetworkInterface" : {
"IpAddress" : "192.168.0.10"
},
"PhysicalNetworkInterfaces" : [ {
"PhysicalNetworkInterfaceId" : "s.ni-XXXXXXXXXXXXXXXXX",
"PhysicalConnectorType" : "RJ45",
"IpAddressAssignment" : "STATIC",
"IpAddress" : "192.168.0.10",
"Netmask" : "255.255.255.0",
"MacAddress" : "XX:XX:XX:XX:XX:XX"
}, {
"PhysicalNetworkInterfaceId" : "s.ni-XXXXXXXXXXXXXXXXX",
"PhysicalConnectorType" : "QSFP",
"IpAddressAssignment" : "STATIC",
"IpAddress" : "0.0.0.0",
"Netmask" : "0.0.0.0",
"MacAddress" : "XX:XX:XX:XX:XX:XX"
}, {
"PhysicalNetworkInterfaceId" : "s.ni-XXXXXXXXXXXXXXXXX",
"PhysicalConnectorType" : "SFP_PLUS",
"IpAddressAssignment" : "STATIC",
"IpAddress" : "0.0.0.0",
"Netmask" : "0.0.0.0",
"MacAddress" : "XX:XX:XX:XX:XX:XX"
} ],
"DeviceCapacities" : [ {
"Name" : "HDD Storage",
"Unit" : "Byte",
"Total" : 99604758360227,
"Available" : 94227739443200
}, {
"Name" : "SSD Storage",
"Unit" : "Byte",
"Total" : 322122547200,
"Available" : 322122547200
}, {
"Name" : "vCPU",
"Unit" : "Number",
"Total" : 24,
"Available" : 24
}, {
"Name" : "Memory",
"Unit" : "Byte",
"Total" : 34359738368,
"Available" : 34359738368
}, {
"Name" : "GPU",
"Unit" : "Number",
"Total" : 0,
"Available" : 0
} ]
}

その他 Snowball Edgeコマンドについては以下URIを参照ください。
https://docs.aws.amazon.com/ja_jp/snowball/latest/developer-guide/using-client-commands.html

次に、AWS CLIを実行するためのconfigureの設定をします。
(少々紛らわしいですが、上の内容までは Snowball Edge Clientコマンドの話で AWS CLIとは別者です)

今回の構成では、Snowball Edge本体が AWSのS3サービスのような役目を果たすと上に書いた通り、
Snowball Edge本体へのアクセスキーおよびシークレットアクセスキーを利用してAWS CLIを実行します。

以下コマンドでSnowball Edgeへのアクセスキーを表示します。

C:\Users\LocalAdmin>snowballEdge list-access-keys
{
"AccessKeyIds" : [ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ]
}

C:\Users\LocalAdmin>

表示したアクセスキーを引数にシークレットアクセスキーを取得します。

C:\Users\LocalAdmin>snowballEdge get-secret-access-key --access-key-id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[snowballEdge]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

C:\Users\LocalAdmin>

これで情報が揃ったのでaws configure等で設定をしておきます。
Default regionとoutput formatは特に指定せずで問題ありませんでした。
既存のcredentialsファイルがあれば、単純に上の内容のprofileとして追加すれば問題ありません。
(今回は新規で導入した端末なのでDefaultで Snowball Edgeのアクセスキーが使われるよう設定しました)

C:\Users\LocalAdmin>aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Default region name [None]:
Default output format [None]:

C:\Users\LocalAdmin>

以下コマンドのように –endpointで Snowball EdgeのURIを指定し、
移行対象のS3 bucketに対しコマンドが正常に通れば成功です。(中身が空だとイマイチ感動が薄めですが…)

C:\Users\LocalAdmin>aws s3 ls s3://XXXXXXXXXXX --endpoint http://192.168.0.10:8080

C:\Users\LocalAdmin>

AWS CLIを利用した事のある方であればもうおわかりだと思いますが、ここまでくれば勝ったも同然といった感じで、あとは単純に ls ではなく cp やら syncで組む事で実際のデータ移行のコマンドになります。

本番の移行実行前のタイミングで想定どおりの速度が出るかを容量の少ないディレクトリで速度計測目的のテストをすると良いでしょう。
今回は、ファイルサイズ傾向が平均的で少なすぎず多すぎずの10GB程度のディレクトリをお客様が見つけてくださったので、そこで想定パフォーマンスが出るか否かを /Speedtest という仮の場所で処理を実行し何度かテストしました。

後にテスト用で利用した場所(/Speedtest)をrmする必要があるのが手間ですが、ファイルサイズ傾向が異なるディレクトリ等で実機のフォーマンス傾向を細かく分析する必要がある時などは事前にターゲットを調査のうえ実施する他ないと思われます。

仮の場所でパフォーマンステストした際のコマンド例

aws s3 cp --recursive \\192.168.0.30\ArchiveData\[10GB程度のちょうどよいディレクトリ] s3://XXXXXXXXXXX/Speedtest/ --endpoint http://192.168.0.10:8080

本番データ移行で利用したコマンド例 (異なるコマンドプロンプトから5パラで実行)
※細かい時間計測をしたい場合、末尾に && echo %date% %time% とかしておくと良いと思います。(Linuxであれば ;date)

aws s3 cp --recursive \\192.168.0.30\ArchiveData s3://XXXXXXXXXXX/ArchiveData/ --endpoint http://192.168.0.10:8080
aws s3 cp --recursive \\192.168.0.30\ArchiveData2 s3://XXXXXXXXXXX/ArchiveData2/ --endpoint http://192.168.0.10:8080
aws s3 cp --recursive \\192.168.0.31\ArchiveData3 s3://XXXXXXXXXXX/ArchiveData3/ --endpoint http://192.168.0.10:8080
aws s3 cp --recursive \\192.168.0.31\ArchiveData4 s3://XXXXXXXXXXX/ArchiveData4/ --endpoint http://192.168.0.10:8080
aws s3 cp --recursive \\192.168.0.31\ArchiveData5 s3://XXXXXXXXXXX/ArchiveData5/ --endpoint http://192.168.0.10:8080

今回のケースでは移行元ボリューム単位で、5パラで実行しましたが、2パラの段階でClientのCPU利用率およびネットワーク使用率があっけなく100%に張り付いてしまいました。移行パフォーマンスも 大体110MB/s=880Mbps程度と1Gbps回線を使い切って頭打ちという状態でした。(まぁ当環境でのベストは尽くせたといった感じです)

結果として当環境での約30TBのコピー処理は 4.20days (100.8h)で完了しました。
(修正予想よりやや遅かったのは USB2.0のHDD分がバスのボトルネックで足を引っ張ったと推測しています)

このようにSnowball Edge ClientではCPU利用率とネットワーク使用率が100%で張り付いた過酷な負荷状態がデータ移行完了までの数日間ずっと続いたりしますのできちんと冷却の効いたマシンにやさしい環境を必ず用意してあげてください。

データ移行後の整合性確認

次にデータ移行が正常に完了したかを確認します。
実は aws s3 cp コマンドもHash値の比較がされ、一致している場合のみ格納されるようかなり信頼性の高いコマンドとなりますが、何らかの原因で失敗したファイルの情報を差分として残せるので cp の後には sync コマンドを実施すると良いでしょう。
(Snowballではvalidateコマンドの実施が推奨されていますが、Snowaball Edgeでは該当しません)

単純に上の cp コマンドを sync に置き換えて実行するだけです。

aws s3 sync \\192.168.0.30\ArchiveData s3://XXXXXXXXXXX/ArchiveData/ --endpoint http://192.168.0.10:8080

今回は、32件インポート失敗している差分を検知しました。
(ディレクトリが失敗すると配下のファイルがすべて失敗するので実際に問題のあった箇所の件数でいえばもっと少ないですが)

差分検知時の出力例 (移行元には存在するが、Snowball Edge側にファイルが存在していない場合)

warning: Skipping file \\192.168.0.30\Archivedata\hoge\piyo\fuga.txt File does not exist.

詳細な原因までは特定できていないのですが、ディレクトリにS3で推奨されない文字列が混在していたり移行元環境側の問題(一時的に破損ファイルのように参照された)と思われる内容もありました。

検知した内容についてはお客様のほうで、別途データ移行完了後に手動アップロードでの対応を実施頂きました。今回は手作業でなんとかなる程度でしたが、環境によってはかなりネガティブな作業となってしまう場合があるのでリスクとして認識しておいたほうが良いでしょう。

Snowball Edgeの返送

データ移行処理がすべて完了したら返送の対応に進みます。

Snowball Edge に対して何も処理が実行されていない事を確認してから、おもむろにフロントの電源ボタンを押下します。(長押しではなく1sec程度押して離す感じで大丈夫です)

すると20-30secぐらいで電源が切れます。
シャットダウン中ですとかその手の前触れのような事はなく突然電源が落ちる感じなので電源ボタンを押したらしばらくは何も触らずに見守りましょう。

その後は集荷の手順に従い、Snowball Edgeの側面に返送用配送ラベルを貼り宅配業者へ集荷の手配をし引き渡すだけです。(今回はお客様に対応頂きました)

仕分け施設へ輸送されているSnowball Edgeのステータス

S3へのインポート

あとは AWS側が S3へのインポート対応の完了を待ちます。
AWSへ輸送された Snowball Edgeは順次インポートが開始されます。
ジョブダッシュボードではこのようにインポートの処理の進捗まで可視化されているので安心ですね。

進捗から計算したところ今回のインポートの場合は、143.25 MB/S = 1,146Mbps程度のパフォーマンスが出ていました。
今回はインポート処理開始から 2.50days (60h10min) で完了しました。

インポート完了後の対応

インポートが完了後するとマネージドコンソールのジョブダッシュボードより「ジョブレポート」、「成功ログ」、「失敗ログ」の取得が可能となります。

ジョブレポートは、PDF形式のファイルでインポート処理詳細と対応に関する時系列の情報が書かれています。(今回は取得し、お客様へ送付しました。)

ジョブレポートのサンプル

成功ログのダウンロードを押下すると
 481MBで2,988,684行の以下CSVファイルがダウンロード出来ました。(ちょっとビビりました)
job-XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX-success-log-decoded.csv

中身は以下3カラムでインポートしたオブジェクト分の内容がずらずらと出力されているものでした。

% head -n 4 job-XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX-success-log-decoded.csv
"S3 Transfer Results Begin"
"Bucket Name","S3 Key","Size"
"XXXXXXXXX","Archivedata/hoge/piyo/fuga.txt","6555"
"XXXXXXXXX","Archivedata/foo/bar/baz.txt","81920"
%

失敗ログのダウンロードを押下すると
今回インポート失敗はなかったので Zero Byteの以下CSVファイルをダウンロード出来ました。
job-XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX-failure-log-decoded.csv

その後、お客様の方で何箇所でピックアップでS3での動作確認を実施頂き特に問題はなかったので、今回のミッションは無事完了となりました。

まとめ

初めてSnowball Edge利用したのですが、簡単に安定したパフォーマンスでデータ移行が出来ました。AWSへのデータ移行でお悩みで、もし条件を満たすようであればSnowball Edgeの利用を検討してみてください。

Snowball Edgeを利用したデータ移行作業は「段取り八分」と言えます。
事前調査や事前準備は入念に行い、いざ現地で困るような事が極力無いようステークホルダー全員が意識し進める事が大切です。

Snowballは、AWSでは珍しい物理(L1)をユーザが取り扱うサービスです。故に信頼性の高い物理環境をユーザ側で用意することが必要不可欠です。
この手の作業環境は会社やら組織で「余っている物の寄せ集め」になりがちですが、以下のうちどれか一つが欠けるだけでもデータ移行は成功しないので十分に注意しましょう。
・Client PCの品質
・ケーブルの品質
・L2SWの品質

おわりに

いかがだったでしょうか?

サービスの特性上、AWSエンジニアでも普段から気軽に触れるものではないのでSnowball Edgeを利用した一つのデータ移行の作業例としてイメージが伝わったのであれば幸いです。

私自身もAWSに関わる仕事をしているとL3以上な世界が多いので、たまにはL1と戯れるというのも新鮮でどこか懐かしくもありとても面白かったです。
個人的にSnowball Edgeの機器本体も良く出来ていると思いましたが、何よりマネージドコンソールのジョブダッシュボードがユーザにとても親切かつわかりやすく洗練されている点に一番感動しました。

ただ、寄せ集めた機器の不慣れな現地環境で新しい事をする訳ですから現場では色々な事が起こり得ます。
今回も大きなトラブルこそないものの、小さなトラブルは色々とありました。
(L2SWの設定がアレだったり、ケーブルも怪しくてはりなおしたり、ClientのH/Wトラブルで想定パフォーマンスが出ずに休日に集まってその切り分けをしたり、まともな端末求め猛暑のなか飯田橋までダッシュしたり…etc)

今回のデータ移行ミッションがうまく完了できたのは素晴らしいAWSサービスの存在はもちろんですが、何よりお客様が強いオーナーシップで指揮/判断系統で引っ張ってくれた事、
お客様とサーバーワークスそれぞれで役割をきちんと果たし、同じ方向を向いて二人三脚で対応出来た事に他ならないと感じています。

ps.昨今は「誤家庭用」ではなく、ギリギリ「ご家庭用」といえるようなメタルの10GbEを搭載した安価なL2SWも市場には出始めています。
お客様も次はもっと良い機器揃えて1GbEの壁を超えたいね!と意気込んでおられましたしネクストステージも楽しみです。

「Amazon Connectでコールセンターへの投資対効果を最大化する方法」セミナーを開催レポート

$
0
0
こんにちは。Amazon Connect を専任で担当している丸山です。
コンタクトセンター界隈では、まだまだ認知度が低いAmazon Connectですが、知っている方からは熱い視線と期待を感じています。
そんなAmazon Connectの活用を前提にコンサルティングができる会社があることをご存知でしょうか。

2月に立ち上げたばかりのプライムフォースと、コンタクトセンター業界での認知度がゼロに親しいサーバーワークスの2社で開催しましたが、予想を超える数のお申込みをいただきました。
そして高い歩留まりであやうく席が足りなくなるところでした。
ご参加いただいたみなさま、どうもありがとうございます。

今回はIVR編と題して、IVRを中心としたコールセンターの投資対効果を中心としたセミナーでした。
各講演内容を3行でご紹介します。
 

「Amazon Connect をはじめるべき3つの理由」

株式会社サーバーワークス 代表取締役 大石 良

世の中を取り巻く環境の変化、とくに「デジタル・ディスラプション」ともいわれている変化の中
これからはシステムをリプレースしていくだけではだめ
お客様へ提供する体験を比較的に変化させ、社員に選んでもらう会社にならなければいけない

「Amazon Connectを使ったコールセンター構築のポイント ~IVR編~」

プライムフォース株式会社 代表取締役 大松 祐子様

顧客満足度が低いIVRのうまくいっていない具体的なケース紹介
コンタクトセンター運営は「つながってからの品質」には努力するが、「つながる前の品質」に不満を持っているケースが多い
IVRもお客様アンケートも変更・進化させて、お客さまと企業の真の価値を見出す

「コールセンターの常識を変える Amazon Connect 最前線 」

株式会社サーバーワークス 営業部 Amazon Connect専任 丸山 麻衣子

Amazon Connectをデモンストレーションで紹介
Connectの特徴と「できること」を紹介
成功している活用パターンと事例を紹介

「Amazon Connectの料金体系と導入後の投資対効果(ROI)」

プライムフォース株式会社 取締役 澤田 哲理様

処理時間の削減に取り組んだ場合の具体的な試算
効果は高いが失敗しているケースが多い現状とその理由
コールセンターのROIを考慮するときのポイントをAmazon Connect/クラウド型ソリューション/オンプレミスで比較

 

セミナーを振り返って

弊社ではAmazon Connect に関するお引き合い、ご相談はありがたいことに継続的に頂いております。
少しずつですが導入事例もご紹介できるようになってきました。
正直言って Amazon Connect を上手に使う提案には自信があります。
しかしROI高めるコンタクトセンターにするためのアプローチはやはり経験豊富なプロの力が必須であると感じました。

今回はIVR編ということで、IVR失敗例を具体的に聞くことができました。
お客様の要件通りのIVRを導入してお客様の不満体験が増えたらわたしもがっかりです。
せっかく Amazon Connect という魅力的なソリューションを利用するのだから、感動する結果をもたらしたいと強く感じたセミナーでした。
 
プライムフォース様とは、第2弾の共催セミナーも企画しています。
どうぞご期待ください。

Tableau OnlineとOneLoginのSAML連携手順

$
0
0

 

技術課の小林です。

今回はTableau Onlineのユーザー認証をOneLoginと連携してSAML認証するための手順を紹介します。

 

OneLoginでコネクタ作成

 

OneLoginにログインした後、右上の[管理]タブを選択します。OneLoginの管理者設定は全て、これを選択すると操作できるようになっています。

上部の[Applications]タブの[Applications]を選択すると現在使用できるApplicationの一覧が表示されます。

 

右上の[Add App]を選択すると、アプリケーションを検索という画面になります。

左上に検索欄があるので、tableauと検索して、[Tableau Online SSO]を選択します。

 

以下のようなTableau Oneline SSOコネクタの初回設定の画面になります。

ここでは何も変更せずに、右上の[Save]を選択します。

 

以上で、Tableau Online SSOのコネクタの追加は完了となります。

 

Tableau OnlineとOneLoginのSAML連携

 

 Tableau Online側の操作になります。

Taleau Onlineにログインし、左下歯車マークの[設定]タブを選択し、上部の[認証]タブを選択します。

認証タイプ項目で、[追加の認証方法を有効にする]を選択した後、[onelogin.com(SAML)]を選択します。

 

[onelogin.com(SAML)]の項目にある[接続の編集]を選択します。

[Tableau Online からメタデータをエクスポート]に記載の[Tableau Online エンティティ ID]と[アサーション コンシューマー サービス URL (ACS)]をコピーします

 

OneLogin側の操作になります。

コピーした値をOneLogin側に設定します。OneLoginのApplication一覧から Tableau Online SSOの設定画面にいきます。

左の[Configuration]タブを選択し、[Consumer URL]に[アサーション コンシューマー サービス URL (ACS)]の値を、[Audience]に[Tableau Online エンティティ ID]の値を入力し、右上の[Save]を選択します。(入力ミスにご注意ください)

 

メタデータのエクスポートを実施します。

右上の[More Action]を選択し、[SAML Metadata]を選択すると、ローカルPCにメタデータファイルが自動的にダウンロードされます。

 

Tableau Online側の操作になります。

今ダウンロードしたメタデータファイルをエクスポートします。

[onelogin.com(SAML)]の項目にある[接続の編集]を選択します。[Tableau Online にメタデータ ファイルをインポート]の[参照]を選択し、先ほどOneLoginでダウンロードしたメタデータファイルをエクスポートし、[適用]を選択すると、[IdP エンティティ ID]と[SSO サービス URL]に自動的に値が入力されます。

テスト接続をすると、以下のようなOneLoginのログイン画面に接続されることが確認できたら成功です。

 

最後に、パラメーターの確認をします。

Tableau Online側の操作になります。

[属性の照合]の値が、以下の値になっていることを確認し、[適用]を選択します。

 

OneLogin側の操作になります。

コピーした値をOneLogin側に設定します。OneLoginのApplication一覧から Tableau Online SSOの設定画面にいきます。

左の[Parameters]タブを選択し、以下の値になっていることを確認し、[Save]を選択します。

 

以上で、SAML連携の設定は完了です。

 

ログイン確認

 

OneLogin側でTableau Onlineを使用するユーザーを作成し、そのユーザーにTableau Online SSOコネクタが表示できるロールが付与されていることを確認した上で、OneLoginにログイン、Tableau Online SSOコネクタをクリックすると、Tableau Onlineにログインできることが確認できます。

 

すると、ID/Passを利用せずにSAML認証でログインが完了できます。

 

おまけ:Tableau Onlineのユーザー追加方法

 

ユーザー追加する場合、OneLoginでユーザー追加した後、Tableau Onlineにユーザー追加することになります。

OneLoginのユーザー追加は弊社ZendeskGuideをご確認ください。

https://support.serverworks.co.jp/hc/ja/articles/360003136554

 

Tableau Onlineのユーザー追加は、右の[ユーザー]タブを選択し、ユーザー設定画面上部の[ユーザーの追加]を選択します。

ユーザーの追加方法を選択する画面になるので、どちらかを選択します。

 

メールアドレスでの追加、CSVファイルでの追加、どちらの場合でも認証方法の選択が必要になりますので、OneLogin経由でログインさせたい場合は、[onelogin.com (SAML) 認証向けにユーザーを追加]してください。

 

参考URL

 

OneLogin を使用した SAML の構成
https://help.tableau.com/current/online/ja-jp/saml_config_onelogin.htm

【Amazon SageMaker】ノートブックインスタンスでRが使える話

$
0
0

0. これ is 何?

Amazon SagemakerのノートブックインスタンスにてRが使えるようになったとのことなので試してみました。まあ、通常のjupyterとは変わらんとは思いますが。

1. ノートブックインスタンス起動

Amaozn SageMakerのノートブックインスタンス一覧から「Create notebook instance」をポチッ

ノートブックインスタンス名を入力。インスタンスタイプは今回はt2.mediumとしまうす。

その他の設定はデフォルトで。「ノートブックインスタンスの作成」をポチッ

インスタンスが起動したら、「Open Jupyter」でJupyterを開きます。

Jupyterの「New」-> 「R」をポチッ(2019/09/12現在はbeta?)。ipynbファイルが作成されます。

開いたノートブックではRが利用できます。

2. いろいろ確認してみる

2-1. バージョン

2019/09/12現在は3.6.1でした

R.version

2-2. パッケージの確認

以下を実行して確認しよう!

installed.packages()

3. まとめ

SageMakerではBYO AlgorithmすればRも利用できますが、Rのスクリプトを書く際にjupyterで書く場合、環境構築しなくてもよくなった点はよさそう。

AWS Certified Machine Learning – Specialty に合格したので自慢したい

$
0
0

合格しました

はい、先々月合格しました。一発合格です。

AWS 認定 機械学習 – 専門知識

このブログは自慢が目的なので参考になるかどうか・試験までに勉強したことが役に立ったかどうかは不明です。

どんな問題がでるかは実際に受けて確かめてください。

勉強前の私のスペック

学生時代にわけあって統計の勉強をしたので、そこらへん内容と「ワタシ、線形モデル・一般化線形モデル、チョットワカル」のレベルでした。あと主成分分析と因子分析も。

当時つかっていた言語はRでした。

AWSのサービスについてはComprehendとTranscribeをプロジェクトで触りました。

試験までに勉強したこと

Amazon SageMaker

とりあえず触ってみました。ノートブックインスタンスについてくるサンプルをこなすだけでなく、自分でデータの収集・前処理・トレーニング・評価・デプロイを行ってみました。

あとはドキュメントの読み込み。とくにどういったことをしたいときにどの組み込みアルゴリズムの使うかを理解しようとしました。

BYO Algorithmについては。。。あんまり気にしませんでした。

機械学習

合わせてG検定の勉強もしようと思いましたが、しませんでした。思っただけです。

また、なんとなくPytorchのチュートリアルを進めてみました。最初のほうだけ。

模擬試験

受けました。模擬試験はダメダメでした。

合格してみて

まあ、合格したのでこの資格に恥じないようもっとちゃんと勉強しようと思います。

旧AZ(apne1-az3)でできないこと

$
0
0

皆さんはap-northeast-1aを使っていらっしゃいますか。
使ってますよね。

私のap-northeast-1aとあなたのap-northeast-1aは本当は違うAZかもしれない。
そんなこと聞いたことありませんか。

自分のAZがなんであるのかはRAMで確認できます。
自分のアカウント間でアベイラビリティーゾーンをマッピングする方法を教えてください。

東京リージョンの場合、一般的にはこんな感じに 「お客様のAZ ID」 が3つ見えます。

ところが、古い時期に作成されたAWSアカウントにはAZが4つあったりします。
そして、もしapne1-az3を実運用で使っていたら要注意です。

apne1-az3は、AWSの新しい機能が提供されない可能性が高いAZとなっております。
どの機能が使えないかの完全なリストは無いのですが、いくつかわかっている制限を以下に記載します。

Transit Gatewayが使えない

Transit Gatewayは、複数のVPC間を接続するサービスですが、これが使えません。
Transit Gatewayでは、Attachment を作成したサブネットと同一のアベイラビリティーゾーンに存在するサブネットとの間でのみ通信を行うことができます。
しかし、Transit Gateway Attachmentを作成する時に「Transit Gateway is not available in availability zone ap-northeast-1a」とエラーが出て、作成不能です。

なお、VPC PeeringやAWS VPNは使用できます。

NAT Gatewayが作れない

NAT ゲートウェイのトラブルシューティング – アベイラビリティーゾーンがサポートされていない

問題
パイプラインを作成しようとすると、NotAvailableInZone エラーが表示されます。

原因
制約のあるアベイラビリティーゾーン (当社による拡張に制限があるゾーン) で NAT ゲートウェイを作成しようとしている可能性があります。

ソリューション
これらのアベイラビリティーゾーンでは NAT ゲートウェイはサポートされていません。別のアベイラビリティーゾーンで NAT ゲートウェイを作成し、それを制約のあるゾーンのプライベート>サブネットで使用できます。リソースを制約のないアベイラビリティーゾーンに移動し、リソースと NAT ゲートウェイのアベイラビリティーゾーンを同じにすることができます。

io1が使えない

Amazon EBS ボリュームの種類 – プロビジョンド IOPS SSD (io1) ボリューム

2012 年以前に作成された一部の AWS アカウントでは、us-west-1 または ap-northeast-1 で プロビジョンド IOPS SSD (io1) ボリュームをサポートしていないアベイラビリティーゾーンにアクセスできる可能性があります。これらのリージョンの 1 つに io1 ボリュームを作成できない場合 (またはブロックデバイスマッピングに io1 ボリュームのあるインスタンスを起動できない場合) は、リージョンの別のアベイラビリティーゾーンを試します。アベイラビリティーゾーンが io1 ボリュームをサポートするかどうかは、4 GiB の io1 ボリュームをそのゾーンに作成することで確認できます。

VPCエンドポイントが作れない

インターフェイス VPC エンドポイント (AWS PrivateLink) – インターフェイスエンドポイントのアベイラビリティゾーンに関する考慮事項

インターフェイスエンドポイントを介したサービスへのアクセスは、一部のアベイラビリティーゾーンでサポートされない場合があります。

まとめ

apne1-az3に新しいリソースを追加するのはなるべく避けましょう。
apne1-az3にある既存リソースの移行も検討してもいいかもしれません。

OneLoginのDB構成の話

$
0
0

こんにちは、鎌田です。
今回、現地時間の9月25日、10月3-4日にそれぞれ行われる、以下のカンファレンスに参加するため、サーバーワークスから、3名海外出張に行っています。

【onelogin connect 2019】
【BoxWorks 2019】

今回出席カンファレンスの中で、OneLoginのDB構成が興味深かったので、ご紹介します
詳しいカンファレンスの内容は、宮澤のブログが以下2本公開されておりますのでご覧ください。

[現地直送便] サンフランシスコ出張記 OneLogin Connect19 Report1
[現地直送便] サンフランシスコ出張記 OneLogin Connect19 Report2

そもそもOneLoginとは

今回のブログで紹介するOneLoginとは、IDaaS(IDentity as a Service)とも呼ばれる、ID管理のSaaSです。各種サービスとSAML連携することもできます。
各種サービスのログインのHUBとして使うことができるサービスとなっています。
宮澤のブログで紹介していますので、細かい紹介はそちらをご覧ください。

さて、そのOneLoginのDB構成とは

ID管理のサービスです。止まってしまったら、各種サービスへのログインのHUBとして使っている場合、ログインが出来なくなり一大事です。
このため、最低でもログインは出来るような構成を検討しておかなくてはなりません。

みなさんは、どんな構成を考えられるでしょうか?

私の方で、資料から書き直した構成図はこちらです。

どんなDB構成なのか?

DB構成としては、以下4つの特徴があります。

  • Masterに対してActive Standayを2つ用意。状況によってRegionをまたがってMasterをFailOverできる構成としておく。
  • Read Rplicaを用意し、3つのAZに配置。
  • Read Replicaを別リージョンにも用意しておく。
  • ユーザーアクセスと管理者アクセスをシステム的に分離し、書き込みが必要な管理者アクセスのみMasterへ、読み込みアクセスでOKなユーザーアクセスのみRead Replicaを利用。

それぞれ見て行きましょう。

Masterに対してActive Standayを2つ用意。状況によってRegionをまたがってMasterをFailOverできる構成としておく

こちらはMasterに対しての障害対策です。

Masterが障害になってしまった場合、まずはAZの中でFailOverできるように、Active StandbyのDBを用意しておきます。
さらにRegionレベルの障害にも対応するため、別リージョンにもMasterを用意しておく、という訳です。
これで、AZレベルの障害にも、Regionレベルの障害にも対応できます。

Read Rplicaを用意し、3つのAZに配置

Read Replicaを別リージョンにも用意しておく

こちらは、Masterに対しての負荷対策です。

Masterに対して読み込み/書き込みすべてのアクセスが集中すると、MasterのDBに負荷が掛かってしまいます。
Read Replicaを用意することで、IDaaSのユーザーアクセスでは多くなる読み込みの処理をMasterからオフロードできます。
Read Replicaを各AZに配置することで負荷分散を実施しつつ、AZの障害に対応しつつ、
Read Replicaを別リージョンにも用意することで、Masterと同じRegionレベルの障害にも対応しています。

ユーザーアクセスと管理者アクセスをシステム的に分離し、書き込みが必要な管理者アクセスのみMasterへ、読み込みアクセスでOKなユーザーアクセスのみRead Replicaを利用

これは、アプリケーションレベルでの負荷対策です。

アプリケーション実装の際に、ユーザーアクセスと管理者アクセスを明示的に分離することで、
万が一MasterのDBが止まることがあっても、ユーザーがアクセスする読み込み処理が止まらないようにしておく、という構成となっています。

Read ReplicaはDBとして構成するのみでは駄目で、アプリケーション側でも、読み込みのみRead Replicaに逃がすような実装が必要です。
その点もしっかり対策されていました。

まとめ

  • DBを構成する際は、障害対策・負荷対策の両方を十分に検討した構成とする
  • インフラ構成のみでは対応しきれない点もあるため、アプリケーション実装も含めて対策を検討する

DB設計を考える上で、参考になれば幸いです。


AWS Service Quotas (サービスクォータ) を使ってみた

$
0
0

AWS Service Quotas (サービスクォータ) って何?

こんにちは!
AWSをこよなく愛す技術4課の山本(通称ヤマゾン)です
11月にSAPro取るぞ

AWS Service Quotas (サービスクォータ) のリリースアナウンスを読んでみましょう

AWSのアカウントには、すべてのお客様に可用性と信頼性の高いサービスを提供し、またオペレーションミスなどによる意図しない支出からユーザーを保護するためのクォータ(制限)を実装しています。

従来、その制限値は以下のページにAWSにおける全アカウント共通の汎用の設定値一覧としてまとまっており
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html
個別のAWSアカウントの設定状態を把握することは難しいのが実情でした

今回実装された新しいサービス AWS Service Quotasでは、AWSアカウント単位、サービス単位で制限値の確認と上限緩和申請を出すことができるようになりました。

AWS Organizations と統合し、新しいアカウントでクォータを簡単に設定することもできます。サービスクォータを使用して、AWS Organizations を通じて作成した新しいアカウントに適用される定義済みクォータリクエストテンプレートを設定するだけです。

これまで、各 AWSサービスのクォータ(制限)を緩和する際には、
サポートセンターに「サービスの制限緩和」というカテゴリでケースを作成していました
適用となっている制限値を確認するには、サービスによってはサポートケースをさかのぼって確認していました

AWS Service Quotas (サービスクォータ) を使うことにより、サポートセンターにケースを作成せずとも緩和申請を行えます
また、ダッシュボードを使い、過去の申請履歴や現在の適用状況を把握することが出来ます

AWS Organizations を使って作成した新しいアカウントにクォータリクエストテンプレートを適用し、各 AWSサービスのクォータ(制限)を緩和する事もできるようです
(本記事では、割愛します ※AWS Organizations を使っていない環境のため)

たまたま機会を見つけたため、サービスクォータを使って、EC2にアタッチするEIPの上限を上げてみました

以下の弊社ブログもご参照ください
* 【速報】AWS Service Quotas がリリースされました! (2019/09/10) 

やってみた

サービス一覧から「サービスクォータ」を選択

「AWSサービス」画面で「EC2」を検索

「サービスクォータ」で「eip」を検索

「Number of EIPs – VPC EIPs」をクリックし、「クォータ引き上げリクエスト」をクリック

「クォータ値を変更」に「30」を入力 (デフォルトの5から30に変更)し「リクエスト」をクリック

「ステータス」が「保留中」になりました

すこし待つと「ステータス」が「終了済み」になりました

「終了済み」をクリックすると、「適用されたクォータ値」は「60」になっていました

「サポートセンターのケース番号」をクリックすると、自動でサポートケースが作成されていたことが分かります

サービスクォータの画面に戻ると、
「ダッシュボード」画面に「保留中のサービスクォータリクエスト」と「最近解決したサービスクォータのリクエスト」が出ます

「クォータリクエスト履歴」画面に「過去のリクエスト」が出ます

気づいた注意点

  • ステータスが「保留中」となったままの場合があります
    • サポートケースを確認すると、AWSからの質問事項が来ていて、こちらの返信待ちになっていました
      • 英語のサポートケースが作成されますので、英語でやり取りすることになります
  • 上の「やってみた」のサポートケースで受け取った回答には、AWSはリクエストした値「30」を適用したと書いてあります
    しかし、サービスクォータやEC2サービスの「制限」画面を見ると、「適用されたクォータ値」は「60」になっていました (実際のところを確認中)

終わりに

新しい機能なので、まだまだAWS側にも改善の余地はありそうです
対応しているAWSサービスも増えてきていて、最近はEFSも対応しました

情報が入り次第、この記事にアップデートしますね

以上、現場からでした!

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

$
0
0

タダです.

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

AWS Data Wranglerを使って、簡単にETL処理を実現する

awslabs/aws-data-wrangler

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

AWS Data Wrangleドキュメント

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 に出力するチュートリアルとなっています.


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

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

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

TLC Trip Record Data

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

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

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']

 

出力後のデータの件数が行削除後のデータ件数かも確認します.  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 のデータ解析のエコシステムを作るときに登場してくる存在として今後のアップデートに注目していきたいですし,採用も検討していきたいですね!

AWS Transit GatewayとDirect ConnectのマルチAWSアカウント構成

$
0
0

技術三課の杉村です。2019年9月、AWS Transit GatewayでDirect Connect Gatewayを利用できる機能が発表されました。
待望のアップデートです。
AWS Direct Connect の AWS Transit Gatewayサポートが東京リージョンに対応しました

このアップデートにより、AWS Transit Gatewayをハブとして、オンプレミスとマルチアカウントのAWS環境をより簡単に専用線で接続できるようになりました。
構成の特徴や注意点を解説します。

1. 構成イメージ図

上記のような構成図の構成が可能になります。

従来まで(本アップデートの登場まで)

従来までは、複数のAWSアカウントに Direct Connect を引こうと考えた場合、2つの方法がありました。

  1. 各AWSアカウントにVirtual Interfaceを作成する => オンプレ側ルータの設定変更が必要
  2. Direct Connect Gatewayのマルチアカウントサポートを利用する => ルータ設定変更は不要だがVPC間の通信は不可(ハブにならない)

これから

今回の構成、つまりTransit GatewayのDirect Connect Gateway利用では、以下のメリットがあります。

  • AWS側の操作だけで複数のAWSアカウントにDirect Connectを伸ばせる
  • Transit Gatewayをハブにして「VPC」「オンプレ(VPN)」「オンプレ(Direct Connect)」間の通信ができる
  • Transit GatewayのRoute Tableで前述の通信の制御を細かく設定できる

なおTransit GatewayとVPCを紐づける際は “Transit Gateway Attachment” という関係リソースを、VPCが存在する各AWSアカウントに作成することになります。
ルーティングの制御は各AttachmentにTransit Gateway Route Tableを紐づけることになりますが、それができるのはTransit Gateway本体を作成したアカウントからのみになります。
つまり、中央AWSアカウントでルーティングの制御が集約できる一方、各AWSアカウントの管理者にDelegationするような運用は現状できません。

2. 前提条件

この構成にするには、以下の前提条件をクリアしている必要があります。

  • A. 接続する全てのVPCが同一リージョンにある
  • B. Transit Gatewayが利用できるAvailability Zoneでの利用である(古いAZではない)
  • (補足)同じOrganizationsに所属している必要はない

A. 接続する全てのVPCは同一リージョンにあること

2019年10月現在、Transit Gatewayではリージョンをまたいだアタッチメント(VPC, VPN, Direct Connect Gateway)間接続はできません。

ただし、その手前のDirect Connect Gatewayはリージョン間で利用ができます。つまりオンプレからDirect Connect Gatewayまで来て、そこで分岐して各リージョンごとのTransit Gatewayに繋ぐような構成は可能です。
ただし、この構成の場合は異なるリージョン間のVPCで通信はできませんため、ご注意ください。(あくまでオンプレイス~各リージョンのVPC間で通信が可能になる)

つまりは現在、Transit Gatewayで実現できるのはリージョン内通信のみです。

B. Transit Gatewayが利用できるAvailability Zoneでの利用であること(古いAZではないこと)

Transit Gatewayの制約として、古いAZではTransit Gatewayが利用できません。
東京リージョンでいえば多くのAWSアカウントで「ap-northeast-b」として認識されるapne1-az3が該当します。

別のAZでTransit GatewayのAttachmentを作ってもだめです。
なぜならTransit Gatewayを通じて通信するリソース(EC2やRDS等)のあるすべてのAZと、Transit Gatewayが紐づけられている必要があるからです。(後述)

この東京リージョンの旧AZは現在では利用できなくなっていますが、古くからAWSをご利用のAWSアカウントでは、既存リソースが残っている可能性がありますのでご注意ください。

東京リージョンの旧AZ(apne1-az3)の制約に関しては、弊社の渡辺が書いたブログを参考に載せておきます。
旧AZ(apne1-az3)でできないこと

(補足)同じOrganizationsに所属している必要はない

Transit Gatewayを複数AWSアカウントで共有するにはAWS Resource Access Manager(以下、AWS RAM)を利用します。
What Is AWS RAM?

AWS RAMは異なるAWSアカウント間でAWSリソースを共有するAWSサービスです。
同一Organization内でリソース共有をする設定なども可能ですが、Transit Gatewayに関しては、シェアするAWSアカウントが同一Organiztionに所属している必要はありません。 ※1 ※2

※1 Direct Connect Gatewayをアカウント間共有する際は同一Organization(同一Payer ID)である必要がありますが、Transit Gatewayではその必要はありません → DXGWでもこちらの制限が緩和されました(AWS Direct Connect Announces the Support for Granular Cost Allocation and Removal of Payer ID Restriction for Direct Connect Gateway Association.)

※2 AWS RAMを用いてAWSアカウント間でリソースを共有する場合、同じOrganizationに所属している必要があるリソースもあります。例えば Subnet の共有(VPC Sharing, Shared VPC)を利用するにはAWSアカウントが同じOrganizationである必要があります(かつ”全ての機能が有効化”されている必要あり)。Transit Gatewayはそうではありません

3. 注意事項

以下の注意事項に十分ご注意ください。

  • A. 既にDirect Connect(あるいはDirect Connect Gateway)を利用している場合でもTransit Virtual Interfaceの作成が必要
  • B. 旧AZではTransit Gatewayが使えない、旧AZにあるEC2等のリソースとも通信できない
  • C. 通信先のVPCリソースが存在する全てのAZのサブネットとTransit Gateway Attachmentを紐づけること

A. 既存のDirect Connect(あるいはDirect Connect Gateway)がある場合でもTransit Virtual Interfaceの作成が必要

既にDirect Connect Gatewayをご利用頂いている場合でも、既存のPrivate Virtual InterfaceをTransit Gatewayに利用することはできません。
Virtual Interfaceには “Public” “Private” “Transit” の3種類があり、このうちTransitという種類のVirtual Interfaceを利用する必要があります。

既存Direct Connect構成からTransit Gateway構成に切り替える際は、最初にこのTransit Virtual Interfaceを作成するという作業が必要です。
このときにオンプレ側ルータの設定追加、およびそちらへの経路切替も必要ですので、注意しましょう。

B. 旧AZではTransit Gatewayが使えない、旧AZにあるEC2等のリソースとも通信できない

前述の通りです。
現在ではこの旧AZは利用できないため、最近AWSアカウントを開設された方は問題ありませんが、古くからAWSをご利用のAWSアカウントでは、既存のリソースが残っている可能性がありますのでご注意ください。

旧AZのリソースと通信させたい場合は、従来通りにVPC PeeringやVirtual Private Gateway(VGW)を残しておく必要があるため、混在の構成となる場合は注意深く設計する必要があります。

C. 通信先のVPCリソースが存在する全てのAZのサブネットとTransit Gateway Attachmentを紐づけること

Transit GatewayとVPCを紐づける際は “Transit Gateway Attachment” という関係リソースを作成します。
Transit Gateway Attachment作成の際には、どのサブネットと紐づけるかを選択します。各AZで1つのサブネットが選択できます。

このとき「VPCの中のどれか一つのAZのサブネットとTransit Gateway Attachmentが紐づいていればいい」のではなく「通信させるリソースが存在する全てのAZのサブネットとTransit Gateway Attachmentを紐づける」必要があります。

例えばTransit Gateway AttachmentがAZ-1aのサブネットとだけ紐づいているとします。
この状態でAZ-1cにあるEC2には、Transit Gateway経由では通信できません。
この状態でAZ-1cのサブネットのルートテーブルからTransit Gatewayに対してルートを向けても、通信することができないのです。
AZ-1cのサブネットにも、紐づける必要があります。

なおTransit Gateway Attachmentが紐づいたサブネットにはTransit GatewayのENIが複数作成されPrivate IPアドレスが消費されるので注意が必要です。

4. さいごに

Transit Gatewayを利用することで、VPC-オンプレ間の詳細な経路制御をTransit Gatewayに集約することができます。
また、かつてはDirect Connectを複数AWSアカウントに引こうとするとオンプレルータの設定変更など手間が生じていましたが、Transit Gatewayを利用することでAWS上の操作で実現することができます。
(Direct Connect Gatewayでも実現できましたが、Transit Gatewayにすることでより詳細に経路を制御したり、VPC間通信が実現できたりする)

ご参考にお願いいたします。

Amazon Linux2にセッションマネージャ、ランコマンドでDSAをインストールする

$
0
0

こんにちは。技術2課の芳賀です。
最近、Amazon Linux2のEC2に対してDSaaSを導入する機会があったので、その際に実施した内容を残しておきたいと思います。

DSaaSですが、AWS MarketplaceでDSaaSのライセンス契約をすることで個人でも気軽に使用することができます。
以前、弊社の寺田がまとめていましたので、こちらを参考に検証環境を構築しました。
AWS Marketplace で Trend Micro Deep Security as a Service のライセンスを契約して、検証環境で使えるようにしてみる

今回の内容としては以下になります。

  1. Deep Security Managerに AWSアカウントを追加
  2. Amazon Linux2にセッションマネージャでDeep Security Agentをインストール
  3. Amazon Linux2にランコマンドでDeep Security Agentをインストール

※OSによってはサポートされていないバージョンのエージェントがインストールされる可能性があるため、確実に希望するバージョンをインストールしたい場合は、今回の方法ではなくバージョン毎のインストーラを使用することをお勧めします。こちらにOS毎にサポートされているDeep Security Agentがまとめられています。 

1.Deep Security ManagerにAWSアカウントを追加

Deep Security Manager(以降DSM)にAWSアカウントを追加することで、そのアカウントに紐づくEC2の一覧を表示することができます。

まず、該当のAWSアカウントにて、AWSマネージメントコンソールへログインしておきます。
※後ほど、DSMとの連携のためCloudFormationにてIAMロールを作成することになります。
DSMにログインします。
「コンピュータ」⇒「+追加」⇒「AWSアカウントの追加」を選択します。
別ウインドウでウィザードが表示されます。
セットアップタイプは「クイック」を選び、「次へ」を選択します。
アカウントのセットアップでは、特に何もせず「次へ」を選択します。
ログインしていたAWSアカウントにてCloudFormationが起動します。
特に何も変更せず「次へ」を選択します。

特に何も変更せず「次へ」を選択します。
特に何も変更せず「次へ」を選択します。
IAMリソースが作成されることを承認するにチェックを入れ、「スタックの作成」を選択します。
スタックのステータスが「CREATE_COMPLETE」になるまで暫く待ちます。
DSMの「コンピュータ」を確認すると、該当のAWSアカウントに構築されたEC2の一覧が表示されます。

2.Amazon Linux2にセッションマネージャでDeep Security Agentをインストール

AmazonLinux2に対して、AWS Systems ManagerのセッションマネージャでDeep Security Agent(以降DSA)をインストールしてみます。

DSMの「サポート情報▼」より、「インストールスクリプト」を選択します。
別ウィンドウが表示されます。
ここからDSAをインストールするためのスクリプトをダウンロードすることができます。
今回はAmazonLinux2にインストールするので以下を選択していきます。

プラットフォーム Linux版Agentのインストール
セキュリティポリシー Base Policy > Linux Server
(指定したいカスタムポリシーがあればここで選択)
コンピュータグループ コンピュータ(デフォルト)
Relayグループ プライマリテナントのRelayグループ(デフォルト)
Deep Security Managerへの接続に使用するプロキシ プロキシを選択(デフォルト、このままで良い)
Relayへの接続に使用するプロキシ プロキシを選択(デフォルト、このままで良い)

下にスクロールすると、実行するスクリプトが確認できます。
ここでは「ファイルに保存」を選択し、スクリプトファイルをダウンロードします。
「AgentDeploymentScript.sh」というファイルがダウンロードされます。

「AgentDeploymentScript.sh」をもとに、セッションマネージャを使用してDSAをインストールしていきます。

AWSマネージメントコンソールにログインし、AWS Systems Managerのサービス画面を起動します。
「インスタンスとノード」から「セッションマネージャー」を選択します。
※セッションマネージャを使用するためには、EC2に事前に「AmazonSSMManagedInstanceCore」のポリシーを付与したロールをアタッチしておく必要があります。後述するランコマンドでも同様です。

インストールしたいEC2を選択し、「セッションの開始」を選択します。

ログイン出来たらrootユーザになります。

sudo su -

任意のフォルダに移動し、スクリプトファイルを作成します。
ここではダウンロードしたファイル名と同じ「AgentDeploymentScript.sh」としました。

cd /tmp
vi AgentDeploymentScript.sh

ダウンロードしたスクリプトファイルの内容を書き込み、スクリプトファイルを実行します。

bash AgentDeploymentScript.sh

暫く待ち「Command session completed.」が表示されればインストール完了です。
DSMにログインしてコンピュータを確認すると、対象インスタンスのステータスが「管理対象(オンライン)」になりました。
対象インスタンスの詳細画面を確認すると、有効にしている機能毎にステータスを確認することができます。
セッションマネージャで問題なくインストールできました。

3.Amazon Linux2にコマンドラインでDeep Security Agentをインストール

AmazonLinux2に対して、AWS Systems ManagerのランコマンドでDSAをインストールしてみます。

AWS Systems Managerのサービス画面を起動し、「インスタンスとノード」から「コマンドの実行」を選択します。
ランコマンドのドキュメントから「AWS-RunShellScript」を選択します。
※以降今回は、明示した操作以外デフォルトのまま進めます
コマンドのパラメータには、DSMからダウンロードしたスクリプトの内容を貼り付けます。
ターゲットは「Choose instances manually」を選択し、DSAのインストールする対象となるEC2インスタンスを選択します。
コマンドが失敗した場合などの内容を確認したい場合は「CloudWatch出力」チェックを入れます。
ここではデフォルトのまま「実行」を選択します。
コマンドが実行され、ステータスが「進行中」から「成功」になるまで暫く待ちます。
ステータスが「成功」になりました。
DSMにログインしてコンピュータを確認すると、対象インスタンスのステータスが「管理対象(オンライン)」になりました。
セッションマネージャの時と同様、対象インスタンスの詳細画面からもステータスが正常であることを確認できます。
ランコマンドで問題なくインストールできました。

最後に

DSaaSのようなサービスを、検証したいときにささっと使えるAWS Marketplaceはとても良いですね。Marketplaceからライセンスを契約したDSaaSの場合、起動した分の時間課金になるのでとてもリーズナブルです。

対象のインスタンスに直接ログインせずにDSAをインストールすることができた、セッションマネージャやランコマンドについても、改めて使ってみて便利な機能だと感じました。活用できる場があればどんどん使っていきたいと思います。

Cloud Automatorが日本時間以外のタイムゾーンに対応しました

$
0
0
Cloud Automator のユーザー、タイマートリガージョブ、タイムゾーンを設定することができるようになりました。
これまでCloud Automatorで表示・設定できる日時は日本時間(JST)のみでしたが、今後は個別に設定することで、日本時間以外のタイムゾーンでの表示やタイマートリガーの設定を行うことができます。
これにより、海外のAWSリージョンに存在するリソースや海外で働く方が利用するリソースを扱う場合に、より直感的に作成・管理できるようになりました。
 

タイマートリガージョブのタイムゾーン設定

タイマートリガーは指定した日時にアクションを実行させることができるトリガーです。
これまでは、日本時間(JST)でしか日時を設定することができませんでした。
今後はジョブ作成・編集画面でタイムゾーンを選択することで、日本時間(JST)以外のタイムゾーンで日時を設定することが可能になります。
例えば、画像のようにタイムゾーンにPacific Timeを選択した場合、Pacific Time (GMT-08:00) の 10月16日0時00分にジョブが実行されます。
 
 

ユーザーのタイムゾーン設定

ユーザーのタイムゾーンを選択することも可能になりました。
ユーザーのタイムゾーンを設定すると、Cloud Automatorで表示される日時情報が、設定されたタイムゾーンを反映したものになります。
*ただし、タイマートリガージョブの次回実行日時は例外的にジョブのタイムゾーンを反映したものが表示されます。
 
 

タイムゾーン設定方法

 
Cloud Automator のトップページ右上のアカウント設定」メニューから設定ページに移動し、タイムゾーンの変更を行うことができます。
 

組織のユーザーのタイムゾーン設定方法

 
組織の管理者権限、またはオーナー権限をお持ちの場合、ユーザー一覧ページの編集ボタンから、組織に所属している他のユーザーのタイムゾーンを設定することできます。
 
 

終わりに

今後のリリース計画については、ロードマップページにて公開しております。
これからも Cloud Automator をよろしくお願いいたします。
Cloud Automator(クラウドオートメーター)とは、ノンプログラミングでAWS運用を自動化し、AWSの利用を最大限に引き出すサービスです。バックアップや災害対策、AWS費用の削減を実現する「ジョブ」と、AWSがガイドライン通りに運用されていることを継続的に確認する「構成レビュー」という2つの機能をご提供しております。

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

$
0
0

技術4課の多田です.

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

milo-minderbinder/AWS-PlantUML

「AWS-PlantUML」とは

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

参考URL

「AWS-PlantUML」を導入するか

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

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

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)
}
}

参考

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

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

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

作図コードのサンプル例

コードの参考例として下記のような定義で 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

プレビュー画面例

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

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

まとめ

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

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

$
0
0

技術4課の多田です.

RDS 及び Aurora で使っている CA 証明書のアップデートがアナウンスされています.今回はこのメンテナンスの情報をまとめ,対処や注意点に触れて関係する方の参考になれば幸いです.

なお,本メンテナンスの対象者は ①rds-ca-2015 を使っている RDS 及び Aurora 環境 と ②クライアント側のルート証明書を使って DB インスタンス及びクラスターに SSL/TLS 接続を行なっているアプリケーションとなります.

 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

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

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

Amazon Relational Database Service (RDS)とAmazon AuroraのSSL/TLS 証明書のアップデートについて

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

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

  • rds-ca-2015の証明書をrds-ca-2019に変更してインスタンスの再起動
  • クライアント側でも新しいルート証明書への入れ替え

参考ドキュメント

注意点

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

また, 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 を利用されている方は多くいらっしゃるかと思いますので,再起動も発生しますし入念に準備を進めて行きましょう.ご不明点などございましたら弊社にお問い合わせいただけますと幸いです.


【Ansible入門】Playbookで変数を使い効率化を図ってみましょう

$
0
0

こんにちは、CI部の柿﨑です。
10/16(水)より、beatmania IIDX 27 HEROIC VERSE が稼働し始めました。
最近は1日1クレを日課にしておりまして、5年のブランクを経て皆伝取得を目指しております。(以前は中伝でした。)
どの分野にも限らず、資格の取得には日々の積み重ねが大事だと思っている今日この頃です。

今回は、前回のAnsible入門の続きを題材にしていこうと思います。
Playbook内で変数を使うことで可読性や保守性を高めていきましょうというのが、主題となります。

本記事の対象者

  • 前回のAWS環境を準備できる方
  • AWS環境にてサクッとAnsibleに触りたい方

本記事のコンセプト

  • なるべくシンプルに
  • 最低限使えるディレクトリ構成でAnsibleの動作を理解する

前提条件

  • 前回の前提条件を満たしつつ、前回同様の環境を準備する

目次

  1. 変数を使ってみよう
  2. Playbookのタスクを効率的に書いてみよう
  3. Playbookを暗号化してみよう
  4. さいごに

1.変数を使ってみよう

前回のPlaybookでは、tasks/main.ymlファイルを以下のように(一部抜粋)記載していました。

- name: create user
  user:
    name: hands-on-user01
    createhome: yes
    state: present
    password: "{{ 'hands-on' | password_hash('sha512') }}"

簡単に書くと各パラメーターをそのまま記載していますね。
Playbookの構文がこれだけならまだ良いですが、実案件で使っていくとコードが膨らんでいくものです。
こんなときにパラメーターを変数化しておくことで、コードを管理しやすくしてくれます。
※お急ぎの方用ですが、最終系は以下のコードになります。そうでない方はパスしてください。

git clone https://github.com/ikayarou/hands-on-02.git

では早速、変数を使えるようにPlaybookを修正していきましょう。
※今回、tasks/main.ymlファイル内のsshd_configは触りません。

  1. Ansibleサーバーにec2-userでSSH接続
  2. 前回のPlaybookがある場合はcd ~/hands-on-01を実行
    Playbookがない場合は、以下の手順を実行
    cd
    git clone https://github.com/ikayarou/hands-on-01.git
    cd hands-on-01
  3. 変数格納用のdefaults/main.ymlファイルを作成
    mkdir roles/hands-on/defaults
    vi roles/hands-on/defaults/main.yml

    以下の内容で保存

    ---
    # hands-on user
    name: hands-on-user01
    home: yes
    state: present
    remove: no
    password: hands-on

  4. tasks/main.ymlを変数が使えるように修正
    vi roles/hands-on/tasks/main.yml

    以下の内容で保存

    ---
    - name: create users
      user:
        name: "{{ name }}"
        createhome: "{{ home }}"
        state: "{{ state }}"
        remove: "{{ remove }}"
        password: "{{ password | password_hash('sha512') }}"
    
    - name: change hostname
      hostname:
        name: "{{ inventory_hostname }}"
    
    - name: modify sshd_config
      lineinfile:
        dest: /etc/ssh/sshd_config
        state: present
        backrefs: yes
        regexp: '^PasswordAuthentication no'
        line: 'PasswordAuthentication yes'
      notify:
        - restart sshd

  5. Playbookを実行し、SSH接続
    sudo ansible-playbook -i inventory/hosts site.yml
    ssh hands-on-user01@192.168.20.4
    ※パスワード、hands-on を入力しEnter

上記手順を実行した先で、以下の状態を確認できればおkです。
※ホスト名がClient01でなく、Clinet01だったらごめんなさい。このブログ更新前のhands-on-01が間違ってました。(Gitコード修正済み)

[hands-on-user01@Client01 ~]$ hostname
Client01
[hands-on-user01@Client01 ~]$

ひとつずつ説明いたします。

まず、tasks/main.ymlファイルですが、パラメーターを変数化するときは以下の形になります。
※passwordのところだけやや違いますが、そこは公式ドキュメントに記載があります。

"{{ 変数名 }}"

変数名をなるべく分かりやすい名称にして、各パラメーターを置き換えていけばおkです!
また、以下の項目を追加しました。

remove: "{{ remove }}"
※のちの手順で使うため追加

- name: change hostname
  hostname:
    name: "{{ inventory_hostname }}"
※対象サーバーのホスト名を変更するタスク

前者はのちの手順で説明します。
後者の変数に関しては次のdefaults/main.ymlファイルと一緒に説明します。

次にdefaults/main.ymlファイルですが、tasks/main.ymlファイルで指定されている変数と変数の値が記載されております。

---
# hands-on user
name: hands-on-user01
home: yes
state: present
remove: no
password: hands-on

このdefaultsディレクトリをhands-onロール配下に作成することで、当該ロールで使用される変数のデフォルト値を定義することができます。
これと似た機能を持つvarsディレクトリというものがあり、どちらも変数を定義することができます。
今回はガッツリAnsibleを触る段階ではありませんので、変数の上書きが容易にできて扱いやすいdefaultsディレクトリを使う方がベターだと考えておkです。

ここでお気づきの方もいるかもしれないですが、defaults/main.ymlファイルに"{{ inventory_hostname }}"のパラメーターが記載されていません。
しかし、Client01サーバーのホスト名がClient01に設定されていました。
これは何かといいますと、マジック変数と呼ばれる機能になります。
こちらに分かりやすく記載されています。
以下画像の赤丸部分の値を引っ張ってきたわけですね!ありがとうAnsible。わざわざ変数のパラメーターを書く必要がありませんので、とても楽ですね♪

2.Playbookのタスクを効率的に書いてみよう

ここまでで変数を使えるようになりました。
ただし、このままの状態でOSのユーザーをいくつも作ってくれえ!
と、頼まれたらどうするのでしょうか。
タスクをコピペして以下のようにしてみたりするかもしれません。

---
- name: create users_1
  user:
    name: "{{ name_1 }}"
    createhome: "{{ home_1 }}"
    state: "{{ state_1 }}"
    remove: "{{ remove_1 }}"
    password: "{{ password_1 | password_hash('sha512') }}"
- name: create users_2
  user:
    name: "{{ name_2 }}"
    createhome: "{{ home_2 }}"
    state: "{{ state_2 }}"
    remove: "{{ remove_2 }}"
    password: "{{ password_2 | password_hash('sha512') }}"

こうするとdefaults/main.ymlファイルも変数のパラメーターを記述していかないといけません。
想像するだけでもしんどいですよね。
そこでwith_itemsと呼ばれるものを使ってみます。

with_itemsをざっくり説明すると、リスト型や辞書型などのパラメーターの数だけタスク処理をループしてくれるものです。
つまり1つのタスクだけ準備して、パラメーターを複数設定すればおkです。
早速、作成するユーザーを3つに増やして書いてみましょう!

  1. tasks/main.ymlファイルにwith_itemsを追記
    cd ~/hands-on-01
    vi roles/hands-on/tasks/main.yml

    以下の内容で保存
    ---
    - name: create users
      user:
        name: "{{ item.name }}"
        createhome: "{{ item.home }}"
        state: "{{ item.state }}"
        remove: "{{ item.remove }}"
        password: "{{ item.password | password_hash('sha512') }}"
      with_items: "{{ users }}"
    
    - name: change hostname
      hostname:
        name: "{{ inventory_hostname }}"
    
    - name: modify sshd_config
      lineinfile:
        dest: /etc/ssh/sshd_config
        state: present
        backrefs: yes
        regexp: '^PasswordAuthentication no'
        line: 'PasswordAuthentication yes'
      notify:
        - restart sshd
  2. defaults/main.ymlファイルの変数の書き方を修正
    vi roles/hands-on/defaults/main.yml

    以下の内容で保存
    ---
    users:
      # hands-on
      - name: hands-on-user01
        home: yes
        state: present
        remove: no
        password: hands-on
    
      # ika
      - name: user-ika
        home: yes
        state: present
        remove: no
        password: ika
    
      # tako
      - name: user-tako
        home: yes
        state: present
        remove: no
        password: tako
  3. Playbookを実行し、SSH接続、ユーザー確認
    sudo ansible-playbook -i inventory/hosts site.yml
    ssh user-ika@192.168.20.4
    ※パスワード、ika を入力しEnter
    
    cat /etc/passwd
    ※末尾に3つのユーザーが追加されていれば成功

こちらもひとつずつ説明していきます。

今回はwith_itemsのパラメーターを変数化していますので、その前提で説明します。
tasks/main.ymlファイルとdefaults/main.ymlファイルの関係は以下の画像のとおりです。
with_itemsuserモジュールと同じインデントになっていることに注意してください。
これはuserモジュールの機能でないことを意味しています。
もし共通の設定があるようでしたら、そこだけwith_itemsとは別の変数として定義すれば、defaults/main.ymlファイルのハッシュの数が減ります。

ではここで、user-ikaだけ削除してみましょう。

  1. defaults/main.ymlファイルを変更
    ※user-ikaユーザーでログインしている場合は、exit でAnsibleサーバーへ戻ってください。
    cd ~/hands-on-01
    vi roles/hands-on/defaults/main.yml

    以下の内容で保存
    ---
    users:
      # hands-on
      - name: hands-on-user01
        home: yes
        state: present
        remove: no
        password: hands-on
    
      # ika
      - name: user-ika
        home: yes
        state: absent
        remove: yes
        password: ika
    
      # tako
      - name: user-tako
        home: yes
        state: present
        remove: no
        password: tako

    # ikastate:remove:の値だけ変更しています。
    ※ここのために今回のハンズオンにてremove:を追加しました。
    詳しくはこちらのremoveの説明を参照ください。
  2. Playbookを実行し、SSH接続確認、ユーザー確認
    sudo ansible-playbook -i inventory/hosts site.yml
    ssh user-ika@192.168.20.4
    ※パスワード、ika を入力しEnter
    ※接続できないことを確認
     
    ssh user-tako@192.168.20.4
    ※パスワード、tako を入力しEnter
    
    cat /etc/passwd
    ※user-ika の表示が消えていれば成功

このようにして1つのタスクで複数のユーザーを同時に作成したり、特定のユーザーだけ削除したりということができました!

3.Playbookを暗号化してみよう

最後はPlaybookを暗号化してみましょう!

ときに平文で載せたくない情報もあると思われます。
例えば、OSユーザーのパスワードですね。
主な暗号化のパターンとしては、Playbookのファイル内全てを暗号化するもの、ファイル内の一部を暗号化するものの2パターンになります。
今回はファイル内の一部を暗号化するansible-vault encrypt_stringを使っていきます。

  1. パラメーターを暗号化する
    ※user-takoユーザーでログインしている場合は、exit でAnsibleサーバーへ戻ってください。
    cd ~/hands-on-01
    ansible-vault encrypt_string 'hands-on' --name 'password'
    パスワードの入力とを求められるため、serverworks と入力、確認用にもう1回

    以下の文字列が出力されるため、Encryption successfulの上の行までコピー
    password: !vault |
              $ANSIBLE_VAULT;1.1;AES256
              63623934306536633137313638633733336134393731656239343334393461313834383137303439
              6231326361336363373730393964643064363632616637340a623163636466326231623164636334
              35313834613065316134616234396433303766313662306634653230396532623133626434663138
              3630636133306365650a633061323137313334633139366566656163616335396537323330373232
              6238
    Encryption successful
  2. defaults/main.ymlファイルを変更する
    vi roles/hands-on/defaults/main.yml

    以下のように前の手順でコピーした値で、# hands-onpassword:を上書きする
    ---
    users:
      # hands-on
      - name: hands-on-user01
        home: yes
        state: present
        remove: no
        password: !vault |
              $ANSIBLE_VAULT;1.1;AES256
              63623934306536633137313638633733336134393731656239343334393461313834383137303439
              6231326361336363373730393964643064363632616637340a623163636466326231623164636334
              35313834613065316134616234396433303766313662306634653230396532623133626434663138
              3630636133306365650a633061323137313334633139366566656163616335396537323330373232
              6238
    
      # ika
      - name: user-ika
        home: yes
        state: present
        remove: no
        password: ika
    
      # tako
      - name: user-tako
        home: yes
        state: present
        remove: no
        password: tako

     
  3. Playbookを実行
    sudo ansible-playbook -i inventory/hosts site.yml --ask-vault-pass
    ※パスワードを聞かれるため、serverworks と入力しEnter

    エラーがなければ完了

実行結果には以下のように暗号化されていたパラメーターが平文で出力されてしまいます。
ここからの情報流出には注意が必要ですね!

ansible-vault encrypt_stringで暗号化するときは、以下のような構文となります。
ansible-vault encrypt_string '暗号化する値' --name '変数名'
このようにピンポイントで暗号化をしておくと、暗号化されたファイルをいちいち複合化して編集、という手間が減ります。
そして、Playbookが暗号化されている場合は、ansible-playbookコマンドに--ask-vault-passオプションを付与する必要があることにもご注意ください。
オプションなしで実行しますと、当然のようにエラーになるだけですので大きな問題はないです。

ほかにも方法はございますが、今回はおまけ程度ということでサラッと暗号化に触れてみました。

さいごに

今回の内容だけでも、それなりにAnsibleを触れるようになると思われます。
ここからは、複数台のサーバーを管理するイメージを持ちつつ、Playbookをどのように書けば効率的か、保守性が高いかを意識していくことで、
オレ流のベストプラクティスが生まれてくるものと思います。
私もまだまだ知らないことばかりですので、ここはこうした方がいいよ!などの情報がありましたら、教えていただけますとうれしいです。

本記事が、皆様のお役に立てれば幸いでございます。

PROFILEUNITY、FLEXAPPを利用したWorkSpacesのアプリケーション管理のご紹介

$
0
0

こんにちは、技術4課の城です。
最近寒暖の差が激しく、体調を崩しやすい季節になりましたね。
かくいう私も先日、風邪をひいてしまい、5日間ほどめちゃめちゃ苦しんでいました。

さて本題に入りますが、私はサーバーワークスに入ってからAmazon WorkSpacesを構築する案件をいくつか対応しました。
すごく簡単にDaaS(Desktop as a Service)環境を構築できることに感動しましたが、継続して管理、運用していく上でいくつか課題があると思っています。
その課題を解決するうえで、Liquidware Labs社が提供しているツール、PROFILEUNITY、FLEXAPPを使ってみたので紹介いたします。
今回はどのように使えるのかのご紹介となりますので、設定手順等は省略している部分が多めになります。

1. WorkSpacesを管理、運用するうえでの課題

今回お話しする課題としてはWorkSpacesにインストールするアプリケーションの管理をどうすべきか、という点になります。
具体的な例をあげると、次のような点があるかと思います。

  • 部署毎に異なるアプリケーションを利用させたいが、どのように管理するか
  • アプリケーションのアップデート

異なるアプリケーションのセットがインストールされたイメージを用意する、もしくは、WorkSpacesのローンチ後に個別にアプリケーションのインストールを実施して対応されていることが多いのかなと思いますが、非常に手間がかかります。
また、アプリケーションのアップデートについてはユーザー任せになりがちになってしまっていることが多いのでは、と思います。

2. PROFILEUNITY、FLEXAPPとはどのようなツールなのか

PROFILEUNITYはユーザー環境を管理するツールとなります。
こちらはLiquidware Labs社が提供しているPROFILEUNITYの機能リストになりますが、様々な設定が可能です。
ユーザー環境のWorkSpaceへの移行を簡単にしたり、設定の管理を管理者が中央集権的に管理することが出来たりするような機能が備わっています。
また、FLEXAPPについては上述のPROFILEUNITYと組み合わせて利用しますが、アプリケーションの管理を容易にします。
例えば特定のグループのみに利用させるアプリケーションなどがある場合、FLEXAPP、PROFILEUNITYを利用すると管理者によるコンソール上での操作でそれを実現します。

なお、利用の前提条件としてActive Directoryを利用(Directory ServiceのMSADでは不可)していることが必要です。

PROFILEUNITY製品ページ: https://www.liquidware.com/products/profileunity
FLEXAPP製品ページ: https://www.liquidware.com/products/flexapp

以降の項にて、具体的にどのようなことが出来るのか、ご紹介いたします。

3. 具体例① ユーザーの所属グループごとに異なるアプリケーションのセットを利用させてみる

二つの部署で異なるアプリケーションのセットを用意してみました。

グループ インストールされるアプリケーション
sales Chrome
tech Chrome、Teraterm、VisualStudioCode

参考までにPROFILEUNITYコンソールは以下のようになります。

それぞれのグループ用の詳細設定画面です

今回は「testuser」というユーザーのグループをsalesからtechへ切り替えて、WorkSpacesにインストールされたアプリケーションを変更できるか確認します。

3.1 salesグループに属した状態でWorkSpacesにログインする

まずはsalesグループに所属した状態で、WorkSpacesにログインします。
testuserのグループは次の画像のように設定しています。

testuserでログインします。
AWSが提供しているバンドルにはChromeは含まれていませんが、Chromeがインストールされていることが確認できます。

ログオフします。

補足ですが、PROFILEUNITYでは各クライアントの設定情報やPortability設定されているデータを、ログオフの時に保存、ログオンの際に読み込みする為、設定変更の際にはログオフ、ログオン操作が必須となります。

3.2 グループをtechに変更

Active Directoryでユーザーの所属グループを変更します。

techグループに属した状態でWorkSpacesにログインする

次にtechフループに所属した状態で、WorkSpacesにログインします。

アプリケーションにChromeだけでなく、teraterm、VisualStudioCodeも追加されています。

所属グループにより、インストールされたアプリケーションを使い分けることが出来ました。

ログオフします。

4. 具体例② アプリケーションをアップデートしてみる

前項でインストールされているTeratermのバージョンは4.102ですが、4.104にアップデートしてみます。

4.1 FLEXAPPにてアプリケーションパッケージを作成する

パッケージを作成するアプリケーションのインストーラーをFLEXAPPサーバー上に用意します。
次にFLEXAPPのコンソールにてアプリケーションパッケージを作成します。

FLEXAPPのコンソールにて[作成]をクリックします。

今回はパッケージ名、VHDの場所を指定し、その他はデフォルト設定としました。

[開始]をクリックし、インストーラーを実行し、アプリケーションをインストールします。

インストールが完了したら、[終了]をクリックします。

「パッケージの作成のプロセスが正常に完了しました。」と表示されているのを確認し、[保存]をクリックします。

コンソールを確認すると、「teraterm-4104」が作成されていることが確認できます。

以上でパッケージ作成は完了です。

補足ですが、FLEXAPPのパッケージ作成プロセスではインストールを実際にサーバー上で実行します。
アプリケーション間の干渉を避けるため、事前にsnapshotの取得しておき、パッケージ作成後にボリュームを事前の状態にロールバックさせることが推奨されています。

4.2 ProfileUnituyにてアプリケーションパッケージを変更する

PROFILEUNITYのコンソールにてアプリケーションパッケージを変更します。
techグループの「teraterm」を削除し、「teraterm-4104」を追加して、保存をクリックします。

これだけだとまだ設定が反映されませんので、デプロイを実行します。
右上の[更新]ボタンをクリックします。

現在利用している構成の[構成のデプロイ]ボタンをクリックします。

ポップアップが表示されるので[デプロイ]をクリックします。

デプロイ完了です。

4.3 再度、WorkSpacesにログインし、Teratermのバージョンを確認する

ログインして確認すると、Teratermのバージョンが4.104に変更されています。

管理者側によるアプリケーションのアップデートが出来ました。

4.4 【おまけ】Teratermのバージョンをロールバックしてみる

PROFILEUNITYにてアプリケーションパッケージの変更を行い、元のバージョンにロールバックしてみます。
先ほどと逆の作業になりますので、画像は省略しますが、次の作業を実施していきます。

①ProfileUnituyにてtechグループの「teraterm-4104」を削除し、「teraterm」を追加
②構成のデプロイ

ログインしてみると、Teratermのバージョンが4.102にロールバックされていることが確認できます。

5. さいごに

今回はPROFILEUNITY、FLEXAPPの機能を一部ですが紹介いたしました。
WorkSpacesの運用における課題を解決できる強力なツールだと感じました。
また、ユーザープロファイルの移行などは、OSによらず、別の環境からAmazon WorkSpacesに移行するにあたって有用な機能ですので、別の記事にて紹介させていただく予定です。

どなたかの助けになれば幸いです。

Fargateコンテナの利用するPublic IPアドレスを固定する

$
0
0

こんにちは!
AWSをこよなく愛す技術4課の山本(通称ヤマゾン)です
昨日は実質9.1時間くらい寝ました

Fargateコンテナの利用するPublic IPアドレスを固定する

以下のような前提があり、Fargateコンテナの利用するPublic IPアドレスを固定することにしました

  • 前提条件
    • Fargateのコンテナから実行する外部API側にファイアウォールがあり、特定のIPアドレスからの接続を許可する仕様となっている

しかし、FargateのコンテナにPublic IPアドレスを割り当てる場合、「自動割当」になるため、IPアドレスを固定することは出来ません
そこで、FargateコンテナをPrivateサブネットに配置し、NAT ゲートウェイを利用することにより、IPアドレスを固定化することにしました

NAT ゲートウェイごとに 1 つだけの Elastic IP アドレスを関連付けることができます。作成後に NAT ゲートウェイから Elastic IP アドレスの関連付けを解除することはできません。NAT ゲートウェイで別の Elastic IP アドレスを使用するには、新しい NAT ゲートウェイを作成してそのアドレスを関連付け、ルートテーブルを更新します。

参考:NAT ゲートウェイ

構成図

  • NATゲートウェイ用パブリックサブネット(AZ-a)
    • 10.0.6.0/26
  • Fargate用プライベートサブネット(AZ-a)
    • 10.0.6.64/26
  • NATゲートウェイ用パブリックサブネット(AZ-c)
    • 10.0.7.0/26
  • Fargate用プライベートサブネット(AZ-c)
    • 10.0.7.64/26

冗長性を持たせるため、NAT ゲートウェイは Fargate コンテナのあるサブネット毎に1つ作成し (図の場合2つ) 、NAT ゲートウェイの持つIPアドレス(図の場合、合計2つ) を、外部API側で許可してもらうようにしました

NATゲートウェイのサポートする帯域幅

  • 以下を見る限り問題なさそうです

NAT ゲートウェイは 5 Gbps の帯域幅をサポートし、45 Gbps まで自動的に拡張します。これ以上必要な場合は、リソースを分割して複数のサブネットに配置し、サブネットごとに NAT ゲートウェイを作成することで、ワークロードを分散できます。

参考:NAT ゲートウェイ

注意点

  • 実際のユースケースに近い方法で負荷試験をしましょう
    • 外部API側で負荷試験を許可していない場合もあるので、事前に確認を取りましょう
      • 外部API側で負荷試験用のエンドポイントを用意してくださっていることもあります
    • 外部API側が過負荷になった際の挙動を把握し、事前に対処できるように実装しましょう

補足

  • Fargate、NATゲートウェイを構築するための情報は多くあるため、実際の構築手順等は割愛しました
  • 弊社内で確認してみたところ、同じ構成で運用している事例も、複数あるようで、問題なく運用しているとのことです

まとめ

Fargateコンテナの利用するPublic IPアドレスを固定する際に、NAT ゲートウェイは有効な解決策となりそうです

また新しい方法や知識を見つけたら共有します!
それでは皆様、良いFargateライフを〜♪

RDSのDBエンジンのバージョン一覧(2019/11/05時点)

$
0
0

こんにちは、仙台オフィス技術2課の芳賀です。
今回でブログの執筆は3回目ですが、私が仙台オフィスに勤務していることを書いていませんでした。私以外にも仙台オフィスには技術課のメンバーがいますので以後お見知りおきを(^^)

今回、DBのエンジンバージョンについて調べる機会があったので、それぞれのRDSについて現在選択できるエンジンバージョンを一覧にまとめてみました。
以前、弊社の寺田がRDSのエンジンバージョンについてまとめていたブログがありました。
RDSのDBエンジンのバージョン一覧(2016/11/07時点)
それから月日が流れ約3年、RDSの種類も増え対応するエンジンバージョンも増えています。

以下のCLIコマンドで、それぞれのRDSのエンジンバージョンを調べました。
describe-db-engine-versions

コマンドでそのまま出力した状態だと不要な情報まで取得できてしまう為、以下を参考に出力内容を加工しました。

AWS CLI からのコマンド出力の制御

調べたタイミング:2019/11/05
リージョン:東京リージョン(ap-northeast-1)

目次

・MySQL
・PostgresSQL
・MariaDB
・Aurora
 ・Aurora-MySQL
 ・Aurora-PostgreSQL
・Oracle
 ・Oracle-EE
 ・Oracle-SE
 ・Oracle-SE1
 ・Oracle-SE2
・SQL Server
 ・SQL Server-EX
 ・SQL Server-Web
 ・SQL Server-SE
 ・SQL Server-EE
・その他
 ・DocumentDB
 ・Neptune

【MySQL】

エンジンバージョン 説明
5.5.46 MySQL 5.5.46
5.5.53 MySQL 5.5.53
5.5.54 MySQL 5.5.54
5.5.57 mysql 5.5.57
5.5.59 mysql 5.5.59
5.5.61 MySQL 5.5.61
5.6.34 MySQL 5.6.34
5.6.35 MySQL 5.6.35
5.6.37 mysql 5.6.37
5.6.39 mysql 5.6.39
5.6.40 MySQL 5.6.40
5.6.41 MySQL 5.6.41
5.6.43 MySQL 5.6.43
5.6.44 MySQL 5.6.44
5.7.16 MySQL 5.7.16
5.7.17 MySQL 5.7.17
5.7.19 mysql 5.7.19
5.7.21 mysql 5.7.21
5.7.22 MySQL 5.7.22
5.7.23 MySQL 5.7.23
5.7.24 MySQL 5.7.24
5.7.25 MySQL 5.7.25
5.7.26 MySQL 5.7.26
8.0.11 MySQL 8.0.11
8.0.13 MySQL 8.0.13
8.0.15 MySQL 8.0.15
8.0.16 MySQL 8.0.16

【PostgresSQL】

エンジンバージョン 説明
9.3.12 PostgreSQL 9.3.12-R1
9.3.14 PostgreSQL 9.3.14-R1
9.3.16 PostgreSQL 9.3.16-R1
9.3.17 PostgreSQL 9.3.17-R1
9.3.19 PostgreSQL 9.3.19-R1
9.3.20 PostgreSQL 9.3.20-R1
9.3.22 PostgreSQL 9.3.22-R1
9.3.23 PostgreSQL 9.3.23-R1
9.3.24 PostgreSQL 9.3.24-R1
9.3.25 PostgreSQL 9.3.25-R1
9.4.7 PostgreSQL 9.4.7-R1
9.4.9 PostgreSQL 9.4.9-R1
9.4.11 PostgreSQL 9.4.11-R1
9.4.12 PostgreSQL 9.4.12-R1
9.4.14 PostgreSQL 9.4.14-R1
9.4.15 PostgreSQL 9.4.15-R1
9.4.17 PostgreSQL 9.4.17-R1
9.4.18 PostgreSQL 9.4.18-R1
9.4.19 PostgreSQL 9.4.19-R1
9.4.20 PostgreSQL 9.4.20-R1
9.4.21 PostgreSQL 9.4.21-R1
9.4.23 PostgreSQL 9.4.23-R1
9.4.24 PostgreSQL 9.4.24-R1
9.5.2 PostgreSQL 9.5.2-R1
9.5.4 PostgreSQL 9.5.4-R1
9.5.6 PostgreSQL 9.5.6-R1
9.5.7 PostgreSQL 9.5.7-R1
9.5.9 PostgreSQL 9.5.9-R1
9.5.10 PostgreSQL 9.5.10-R1
9.5.12 PostgreSQL 9.5.12-R1
9.5.13 PostgreSQL 9.5.13-R1
9.5.14 PostgreSQL 9.5.14-R1
9.5.15 PostgreSQL 9.5.15-R1
9.5.16 PostgreSQL 9.5.16-R1
9.5.18 PostgreSQL 9.5.18-R1
9.5.19 PostgreSQL 9.5.19-R1
9.6.1 PostgreSQL 9.6.1-R1
9.6.2 PostgreSQL 9.6.2-R1
9.6.3 PostgreSQL 9.6.3-R1
9.6.5 PostgreSQL 9.6.5-R1
9.6.6 PostgreSQL 9.6.6-R1
9.6.8 PostgreSQL 9.6.8-R1
9.6.9 PostgreSQL 9.6.9-R1
9.6.10 PostgreSQL 9.6.10-R1
9.6.11 PostgreSQL 9.6.11-R1
9.6.12 PostgreSQL 9.6.12-R1
9.6.14 PostgreSQL 9.6.14-R1
9.6.15 PostgreSQL 9.6.15-R1
10.1 PostgreSQL 10.1-R1
10.3 PostgreSQL 10.3-R1
10.4 PostgreSQL 10.4-R1
10.5 PostgreSQL 10.5-R1
10.6 PostgreSQL 10.6-R1
10.7 PostgreSQL 10.7-R1
10.9 PostgreSQL 10.9-R1
10.1 PostgreSQL 10.10-R1
11.1 PostgreSQL 11.1-R1
11.2 PostgreSQL 11.2-R1
11.4 PostgreSQL 11.4-R1
11.5 PostgreSQL 11.5-R1

【MariaDB】

エンジンバージョン 説明
10.0.17 MariaDB 10.0.17
10.0.24 MariaDB 10.0.24
10.0.28 MariaDB 10.0.28
10.0.31 mariadb 10.0.31
10.0.32 mariadb 10.0.32
10.0.34 mariadb 10.0.34
10.0.35 MariaDB 10.0.35
10.1.14 MariaDB 10.1.14
10.1.19 MariaDB 10.1.19
10.1.23 mariadb 10.1.23
10.1.26 mariadb 10.1.26
10.1.31 mariadb 10.1.31
10.1.34 MariaDB 10.1.34
10.2.11 MariaDB 10.2.11
10.2.12 mariadb 10.2.12
10.2.15 MariaDB 10.2.15
10.2.21 MariaDB 10.2.21
10.3.8 MariaDB 10.3.8
10.3.13 MariaDB 10.3.13

【Aurora】

【Aurora-MySQL】

エンジンバージョン 説明
5.6.10a Aurora (MySQL)-5.6.10a
5.6.mysql_aurora.1.19.0 Aurora (MySQL 5.6) 1.19.0
5.6.mysql_aurora.1.19.1 Aurora (MySQL 5.6) 1.19.1
5.6.mysql_aurora.1.19.2 Aurora (MySQL 5.6) 1.19.2
5.6.mysql_aurora.1.19.5 Aurora (MySQL 5.6) 1.19.5
5.6.mysql_aurora.1.20.0 Aurora (MySQL 5.6) 1.20.0
5.7.12 Aurora (MySQL)-5.7.12
5.7.mysql_aurora.2.03.2 Aurora (MySQL 5.7) 2.03.2
5.7.mysql_aurora.2.03.3 Aurora (MySQL 5.7) 2.03.3
5.7.mysql_aurora.2.03.4 Aurora (MySQL 5.7) 2.03.4
5.7.mysql_aurora.2.04.0 Aurora (MySQL 5.7) 2.04.0
5.7.mysql_aurora.2.04.1 Aurora (MySQL 5.7) 2.04.1
5.7.mysql_aurora.2.04.2 Aurora (MySQL 5.7) 2.04.2
5.7.mysql_aurora.2.04.3 Aurora (MySQL 5.7) 2.04.3
5.7.mysql_aurora.2.04.4 Aurora (MySQL 5.7) 2.04.4
5.7.mysql_aurora.2.04.5 Aurora (MySQL 5.7) 2.04.5
5.7.mysql_aurora.2.04.6 Aurora (MySQL 5.7) 2.04.6
5.7.mysql_aurora.2.05.0 Aurora (MySQL 5.7) 2.05.0

【Aurora-PostgreSQL】

エンジンバージョン 説明
9.6.8 Aurora PostgreSQL (compatible with PostgreSQL 9.6.8)
9.6.9 Aurora PostgreSQL (compatible with PostgreSQL 9.6.9)
9.6.11 Aurora PostgreSQL (compatible with PostgreSQL 9.6.11)
9.6.12 Aurora PostgreSQL (compatible with PostgreSQL 9.6.12)
10.5 Aurora PostgreSQL (compatible with PostgreSQL 10.5)
10.6 Aurora PostgreSQL (compatible with PostgreSQL 10.6)
10.7 Aurora PostgreSQL (compatible with PostgreSQL 10.7)

Oracle

【Oracle-EE】(Enterprise Edition)

エンジンバージョン 説明
11.2.0.4.v1 Oracle 11.2.0.4.v1
11.2.0.4.v3 Oracle 11.2.0.4.v3
11.2.0.4.v4 Oracle 11.2.0.4.v4
11.2.0.4.v5 Oracle 11.2.0.4.v5
11.2.0.4.v6 Oracle 11.2.0.4.v6
11.2.0.4.v7 Oracle 11.2.0.4.v7
11.2.0.4.v8 Oracle 11.2.0.4.v8
11.2.0.4.v9 Oracle 11.2.0.4.v9
11.2.0.4.v10 Oracle 11.2.0.4.v10
11.2.0.4.v11 Oracle 11.2.0.4.v11
11.2.0.4.v12 Oracle 11.2.0.4.v12
11.2.0.4.v13 Oracle 11.2.0.4.v13
11.2.0.4.v14 Oracle 11.2.0.4.v14
11.2.0.4.v15 Oracle 11.2.0.4.v15
11.2.0.4.v16 Oracle 11.2.0.4.v16
11.2.0.4.v17 Oracle 11.2.0.4.v17
11.2.0.4.v18 Oracle 11.2.0.4.v18
11.2.0.4.v19 Oracle 11.2.0.4.v19
11.2.0.4.v20 Oracle 11.2.0.4.v20
11.2.0.4.v21 Oracle 11.2.0.4.v21
12.1.0.2.v1 Oracle 12.1.0.2.v1
12.1.0.2.v2 Oracle 12.1.0.2.v2
12.1.0.2.v3 Oracle 12.1.0.2.v3
12.1.0.2.v4 Oracle 12.1.0.2.v4
12.1.0.2.v5 Oracle 12.1.0.2.v5
12.1.0.2.v6 Oracle 12.1.0.2.v6
12.1.0.2.v7 Oracle 12.1.0.2.v7
12.1.0.2.v8 Oracle 12.1.0.2.v8
12.1.0.2.v9 Oracle 12.1.0.2.v9
12.1.0.2.v10 Oracle 12.1.0.2.v10
12.1.0.2.v11 Oracle 12.1.0.2.v11
12.1.0.2.v12 Oracle 12.1.0.2.v12
12.1.0.2.v13 Oracle 12.1.0.2.v13
12.1.0.2.v14 Oracle 12.1.0.2.v14
12.1.0.2.v15 Oracle 12.1.0.2.v15
12.1.0.2.v16 Oracle 12.1.0.2.v16
12.1.0.2.v17 Oracle 12.1.0.2.v17
12.2.0.1.ru-2018-10.rur-2018-10.r1 Oracle 12.2.0.1.ru-2018-10.rur-2018-10.r1
12.2.0.1.ru-2019-01.rur-2019-01.r1 Oracle 12.2.0.1.ru-2019-01.rur-2019-01.r1
12.2.0.1.ru-2019-04.rur-2019-04.r1 Oracle 12.2.0.1.ru-2019-04.rur-2019-04.r1
12.2.0.1.ru-2019-07.rur-2019-07.r1 Oracle 12.2.0.1.ru-2019-07.rur-2019-07.r1
18.0.0.0.ru-2019-07.rur-2019-07.r1 Oracle 18.0.0.0.ru-2019-07.rur-2019-07.r1

【Oracle-SE】(Standard Edition)

エンジンバージョン 説明
11.2.0.4.v1 Oracle 11.2.0.4.v1
11.2.0.4.v3 Oracle 11.2.0.4.v3
11.2.0.4.v4 Oracle 11.2.0.4.v4
11.2.0.4.v5 Oracle 11.2.0.4.v5
11.2.0.4.v6 Oracle 11.2.0.4.v6
11.2.0.4.v7 Oracle 11.2.0.4.v7
11.2.0.4.v8 Oracle 11.2.0.4.v8
11.2.0.4.v9 Oracle 11.2.0.4.v9
11.2.0.4.v10 Oracle 11.2.0.4.v10
11.2.0.4.v11 Oracle 11.2.0.4.v11
11.2.0.4.v12 Oracle 11.2.0.4.v12
11.2.0.4.v13 Oracle 11.2.0.4.v13
11.2.0.4.v14 Oracle 11.2.0.4.v14
11.2.0.4.v15 Oracle 11.2.0.4.v15
11.2.0.4.v16 Oracle 11.2.0.4.v16
11.2.0.4.v17 Oracle 11.2.0.4.v17
11.2.0.4.v18 Oracle 11.2.0.4.v18
11.2.0.4.v19 Oracle 11.2.0.4.v19
11.2.0.4.v20 Oracle 11.2.0.4.v20
11.2.0.4.v21 Oracle 11.2.0.4.v21

【Oracle-SE1】(Standard Edition One)

エンジンバージョン 説明
11.2.0.4.v1 Oracle 11.2.0.4.v1
11.2.0.4.v3 Oracle 11.2.0.4.v3
11.2.0.4.v4 Oracle 11.2.0.4.v4
11.2.0.4.v5 Oracle 11.2.0.4.v5
11.2.0.4.v6 Oracle 11.2.0.4.v6
11.2.0.4.v7 Oracle 11.2.0.4.v7
11.2.0.4.v8 Oracle 11.2.0.4.v8
11.2.0.4.v9 Oracle 11.2.0.4.v9
11.2.0.4.v10 Oracle 11.2.0.4.v10
11.2.0.4.v11 Oracle 11.2.0.4.v11
11.2.0.4.v12 Oracle 11.2.0.4.v12
11.2.0.4.v13 Oracle 11.2.0.4.v13
11.2.0.4.v14 Oracle 11.2.0.4.v14
11.2.0.4.v15 Oracle 11.2.0.4.v15
11.2.0.4.v16 Oracle 11.2.0.4.v16
11.2.0.4.v17 Oracle 11.2.0.4.v17
11.2.0.4.v18 Oracle 11.2.0.4.v18
11.2.0.4.v19 Oracle 11.2.0.4.v19
11.2.0.4.v20 Oracle 11.2.0.4.v20
11.2.0.4.v21 Oracle 11.2.0.4.v21

【Oracle-SE2】(Standard Edition Two)

エンジンバージョン 説明
12.1.0.2.v2 Oracle 12.1.0.2.v2
12.1.0.2.v3 Oracle 12.1.0.2.v3
12.1.0.2.v4 Oracle 12.1.0.2.v4
12.1.0.2.v5 Oracle 12.1.0.2.v5
12.1.0.2.v6 Oracle 12.1.0.2.v6
12.1.0.2.v7 Oracle 12.1.0.2.v7
12.1.0.2.v8 Oracle 12.1.0.2.v8
12.1.0.2.v9 Oracle 12.1.0.2.v9
12.1.0.2.v10 Oracle 12.1.0.2.v10
12.1.0.2.v11 Oracle 12.1.0.2.v11
12.1.0.2.v12 Oracle 12.1.0.2.v12
12.1.0.2.v13 Oracle 12.1.0.2.v13
12.1.0.2.v14 Oracle 12.1.0.2.v14
12.1.0.2.v15 Oracle 12.1.0.2.v15
12.1.0.2.v16 Oracle 12.1.0.2.v16
12.1.0.2.v17 Oracle 12.1.0.2.v17
12.2.0.1.ru-2018-10.rur-2018-10.r1 Oracle 12.2.0.1.ru-2018-10.rur-2018-10.r1
12.2.0.1.ru-2019-01.rur-2019-01.r1 Oracle 12.2.0.1.ru-2019-01.rur-2019-01.r1
12.2.0.1.ru-2019-04.rur-2019-04.r1 Oracle 12.2.0.1.ru-2019-04.rur-2019-04.r1
18.0.0.0.ru-2019-07.rur-2019-07.r1 Oracle 18.0.0.0.ru-2019-07.rur-2019-07.r1

SQL Server

SQL Serverのエンジンバージョン毎のサービスパックを知りたい場合はこちらを参照してください。

【AWSで選択できる製品バージョンのSP早見表】

製品バージョン サービスパック エンジンバージョン
SQL Server 2012 RTM 11.00.2xxx.x
SP1 11.00.3xxx.x
SP2 11.00.5xxx.x
SP3 11.00.6xxx.x
SP4 11.00.7xxx.x
SQL Server 2014 RTM 12.00.2xxx.x
SP1 12.00.4xxx.x
SP2 12.00.5xxx.x
SQL Server 2016 RTM 13.00.2xxx.x
SP1 13.00.4xxx.x
SP2 13.00.5xxx.x
SQL Server 2017 RTM 14.00.xxxx.x

【SQL Server-EX】(Express Edition)

エンジンバージョン 説明
11.00.5058.0.v1 SQL Server 2012 11.00.5058.0.v1
11.00.6020.0.v1 SQL Server 2012 11.00.6020.0.v1
11.00.6594.0.v1 SQL Server 2012 11.00.6594.0.v1
11.00.7462.6.v1 SQL Server 2012 11.00.7462.6.v1
12.00.4422.0.v1 SQL Server 2014 12.00.4422.0.v1
12.00.5000.0.v1 SQL Server 2014 12.00.5000.0.v1
12.00.5546.0.v1 SQL Server 2014 12.00.5546.0.v1
12.00.5571.0.v1 SQL Server 2014 12.00.5571.0.v1
12.00.6293.0.v1 SQL Server 2014 12.00.6293.0.v1
13.00.2164.0.v1 SQL Server 2016 13.00.2164.0.v1
13.00.4422.0.v1 SQL Server 2016 13.00.4422.0.v1
13.00.4451.0.v1 SQL Server 2016 13.00.4451.0.v1
13.00.4466.4.v1 SQL Server 2016 13.00.4466.4.v1
13.00.4522.0.v1 SQL Server 2016 13.00.4522.0.v1
13.00.5216.0.v1 SQL Server 2016 13.00.5216.0.v1
13.00.5292.0.v1 SQL Server 2016 13.00.5292.0.v1
13.00.5366.0.v1 SQL Server 2016 13.00.5366.0.v1
13.00.5426.0.v1 SQL Server 2016 13.00.5426.0.v1
14.00.1000.169.v1 SQL Server 2017 14.00.1000.169.v1
14.00.3015.40.v1 SQL Server 2017 14.00.3015.40.v1
14.00.3035.2.v1 SQL Server 2017 14.00.3035.2.v1
14.00.3049.1.v1 SQL Server 2017 14.00.3049.1.v1
14.00.3192.2.v1 SQL Server 2017 14.00.3192.2.v1
14.00.3223.3.v1 SQL Server 2017 14.00.3223.3.v1

【SQL Server-Web】(Web Edition)

エンジンバージョン 説明
11.00.5058.0.v1 SQL Server 2012 11.00.5058.0.v1
11.00.6020.0.v1 SQL Server 2012 11.00.6020.0.v1
11.00.6594.0.v1 SQL Server 2012 11.00.6594.0.v1
11.00.7462.6.v1 SQL Server 2012 11.00.7462.6.v1
12.00.4422.0.v1 SQL Server 2014 12.00.4422.0.v1
12.00.5000.0.v1 SQL Server 2014 12.00.5000.0.v1
12.00.5546.0.v1 SQL Server 2014 12.00.5546.0.v1
12.00.5571.0.v1 SQL Server 2014 12.00.5571.0.v1
12.00.6293.0.v1 SQL Server 2014 12.00.6293.0.v1
13.00.2164.0.v1 SQL Server 2016 13.00.2164.0.v1
13.00.4422.0.v1 SQL Server 2016 13.00.4422.0.v1
13.00.4451.0.v1 SQL Server 2016 13.00.4451.0.v1
13.00.4466.4.v1 SQL Server 2016 13.00.4466.4.v1
13.00.4522.0.v1 SQL Server 2016 13.00.4522.0.v1
13.00.5216.0.v1 SQL Server 2016 13.00.5216.0.v1
13.00.5292.0.v1 SQL Server 2016 13.00.5292.0.v1
13.00.5366.0.v1 SQL Server 2016 13.00.5366.0.v1
13.00.5426.0.v1 SQL Server 2016 13.00.5426.0.v1
14.00.1000.169.v1 SQL Server 2017 14.00.1000.169.v1
14.00.3015.40.v1 SQL Server 2017 14.00.3015.40.v1
14.00.3035.2.v1 SQL Server 2017 14.00.3035.2.v1
14.00.3049.1.v1 SQL Server 2017 14.00.3049.1.v1
14.00.3192.2.v1 SQL Server 2017 14.00.3192.2.v1
14.00.3223.3.v1 SQL Server 2017 14.00.3223.3.v1

【SQL Server-SE】(Standard Edition)

エンジンバージョン 説明
11.00.5058.0.v1 SQL Server 2012 11.00.5058.0.v1
11.00.6020.0.v1 SQL Server 2012 11.00.6020.0.v1
11.00.6594.0.v1 SQL Server 2012 11.00.6594.0.v1
11.00.7462.6.v1 SQL Server 2012 11.00.7462.6.v1
12.00.4422.0.v1 SQL Server 2014 12.00.4422.0.v1
12.00.5000.0.v1 SQL Server 2014 12.00.5000.0.v1
12.00.5546.0.v1 SQL Server 2014 12.00.5546.0.v1
12.00.5571.0.v1 SQL Server 2014 12.00.5571.0.v1
12.00.6293.0.v1 SQL Server 2014 12.00.6293.0.v1
13.00.2164.0.v1 SQL Server 2016 13.00.2164.0.v1
13.00.4422.0.v1 SQL Server 2016 13.00.4422.0.v1
13.00.4451.0.v1 SQL Server 2016 13.00.4451.0.v1
13.00.4466.4.v1 SQL Server 2016 13.00.4466.4.v1
13.00.4522.0.v1 SQL Server 2016 13.00.4522.0.v1
13.00.5216.0.v1 SQL Server 2016 13.00.5216.0.v1
13.00.5292.0.v1 SQL Server 2016 13.00.5292.0.v1
13.00.5366.0.v1 SQL Server 2016 13.00.5366.0.v1
13.00.5426.0.v1 SQL Server 2016 13.00.5426.0.v1
14.00.1000.169.v1 SQL Server 2017 14.00.1000.169.v1
14.00.3015.40.v1 SQL Server 2017 14.00.3015.40.v1
14.00.3035.2.v1 SQL Server 2017 14.00.3035.2.v1
14.00.3049.1.v1 SQL Server 2017 14.00.3049.1.v1
14.00.3192.2.v1 SQL Server 2017 14.00.3192.2.v1
14.00.3223.3.v1 SQL Server 2017 14.00.3223.3.v1

【SQL Server-EE】(Enterprise Edition)

エンジンバージョン 説明
11.00.5058.0.v1 SQL Server 2012 11.00.5058.0.v1
11.00.6020.0.v1 SQL Server 2012 11.00.6020.0.v1
11.00.6594.0.v1 SQL Server 2012 11.00.6594.0.v1
11.00.7462.6.v1 SQL Server 2012 11.00.7462.6.v1
12.00.5000.0.v1 SQL Server 2014 12.00.5000.0.v1
12.00.5546.0.v1 SQL Server 2014 12.00.5546.0.v1
12.00.5571.0.v1 SQL Server 2014 12.00.5571.0.v1
12.00.6293.0.v1 SQL Server 2014 12.00.6293.0.v1
13.00.2164.0.v1 SQL Server 2016 13.00.2164.0.v1
13.00.4422.0.v1 SQL Server 2016 13.00.4422.0.v1
13.00.4451.0.v1 SQL Server 2016 13.00.4451.0.v1
13.00.4466.4.v1 SQL Server 2016 13.00.4466.4.v1
13.00.4522.0.v1 SQL Server 2016 13.00.4522.0.v1
13.00.5216.0.v1 SQL Server 2016 13.00.5216.0.v1
13.00.5292.0.v1 SQL Server 2016 13.00.5292.0.v1
13.00.5366.0.v1 SQL Server 2016 13.00.5366.0.v1
13.00.5426.0.v1 SQL Server 2016 13.00.5426.0.v1
14.00.1000.169.v1 SQL Server 2017 14.00.1000.169.v1
14.00.3015.40.v1 SQL Server 2017 14.00.3015.40.v1
14.00.3035.2.v1 SQL Server 2017 14.00.3035.2.v1
14.00.3049.1.v1 SQL Server 2017 14.00.3049.1.v1
14.00.3192.2.v1 SQL Server 2017 14.00.3192.2.v1
14.00.3223.3.v1 SQL Server 2017 14.00.3223.3.v1

その他

以下DocumentDB、Neptuneについては、今回のCLIで取得できたのでついでに載せました。

【DocumentDB】

エンジンバージョン 説明
3.6.0 Amazon DocumentDB (with MongoDB compatibility)

【Neptune】

エンジンバージョン 説明
1.0.1.0 Neptune-1.0.1.0.200502.0

まとめ

CLIはやっぱり便利ですね。AWSマネージメントコンソールにログインせずとも、使用できるエンジンバージョンの一覧がCLIで取得できました。

ただ、単にCLIで一覧を取得しただけでは今回の表にすることはできませんでした(Lambdaなど使用すれば一発で出せるようにできるとは思いますが・・・)。例えばAuroraに関しては、最初はMySQLだけだった為か、エンジン名が「aurora-mysql」ではなく「aurora」となっている一覧が取得できたりとAurora-MySQLにまとめてやる必要がありました。
また、実はCLIで一覧を取得した際、理由はよくわかっていないのですが余計な情報も取得されることがわかりました。

・一部RDSで重複したエンジンバージョンが取得される
・マネコン上で選択できないエンジンバージョンが取得される

サポートが切れたエンジンバージョンなどが取得されたのだろうと想定していましたが、CLIで取得した一覧を見る限り関係しそうな差異を見つけることが出来ませんでした。
今回まとめた一覧は、マネコン上で選択可能かどうかを見比べたので選択できないということはありません。この件については別途調べてみたいと思います。

Googleカレンダの予定開始3分前になったら、予定開始まで1分毎に、Slackにメンション付き通知するGASスクリプト

$
0
0

こんにちは!
AWSをこよなく愛す技術4課の山本(通称ヤマゾン)です
昨日は実質9.2時間くらい寝ました

この記事を書くことになった背景

弊社はGoogleカレンダーを使って、社内の予定を管理しています
Googleカレンダーは予定の時間が近づくと、通知(リマインド)してくれます
↓こんなの

また、予定開始時間の5分前になったら、Slackに通知(リマインド)してくれるプラグインもあります
↓こんなの

しかし、上の通知を私はいつも逃してしまいます…なぜだ…

毎日朝一番にその日の予定は確認するものの、他の作業や、何かを読むのに集中していると、
つい予定に入っている会議を忘れてしまいます
結果として、私がいつも忘れてしまうのが、所属している課の朝会です

10:30からGoogle meet (WEB会議) で開催していて、meetの参加メンバーにいつも私だけがいないので、課の皆さんから私宛にSlack通知が来ます
( 今日は過去最高の3メンションを記録してしまいました! )

この悔しさを解決するために、どのような通知(リマインド)なら絶対に気付くことが出来るか?を考えました
そして、「Googleカレンダの予定開始3分前になったら、予定開始まで1分毎に、Slackにメンション付き通知をもらえると、気付くことが出来そう」と結論づけました

5分前に通知が来ても、WEB会議の準備は1〜2分で出来るため「あと5分もあるし、いっか」となっていました
3分前、2分前、1分前と通知をもらうことにより、間に合う確率は、上がりそうです

私のSlack通知設定は以下になっています
1. Slackにメンション付きの通知をもらうと、PCで音が鳴る (概ねBlueToothのイヤホンをしているため、イヤホンに音が来る)
2. PCを閉じているときは、携帯にバイブレーション通知する

Googleカレンダの予定開始3分前になったら、予定開始まで1分毎に、Slackにメンション付き通知するGASスクリプト

以下のようになりました

// Googleカレンダから予定を取得し、開始3分前になったらSlackにメンション付きで通知する 開始まで1分毎に通知する
// このスクリプトを1分毎に実行するようトリガー登録してくださいね
// 準備するもの・・・Slackに、Incoming WEB hook を1つ用意してください


// 変数定義 //////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Googleカレンダ関連
var calenderid = 'yamamoto.fugafuga@hogehoge.co.jp' // カレンダーID (基本的にメールアドレス)

// Slack関連 ( Incoming WEB hook を1つ用意してください )
var channel = "#hoge" // 通知先チャンネル
var mention = "@yamamoto" // メンション宛先
var username = 'カレンダお知らせbot';  // 通知時に表示されるユーザー名
var icon = ':nyancat:';  // 通知時に表示されるアイコン
var incomingHookUrl = 'https://hooks.slack.com/services/hogehoge/hugahuga/fugahoge'; // Incoming WEB Hook URL


// 関数定義 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
// Googleカレンダから予定を取得し、開始3分前になったらSlackにメンション付きで通知する 開始まで1分毎に通知する 関数
function remindGoogleCalender(){

  // カレンダーから予定を取得する
  var cal = CalendarApp.getCalendarById(calenderid);
  var events = cal.getEventsForDay(new Date());

  // 各予定1つ1つに実行する処理
  for(var i=1; i < events.length; i++){

    //予定への参加が「いいえ」の場合は除く 
    if (events[i].getMyStatus().toString() !== "NO") {
              
      // 予定の件名、開始時間を取得
      startTime = events[i].getStartTime();
      eventName = events[i].getTitle();
    
      //予定の開始時間から3分引いた時刻を取得
      var fiveMinutesBefore = (startTime.getTime() - 3*60*1000);

      //現在時刻を取得
      var now = new Date();    
    
      //「現在時刻が、予定の開始時間から3分引いた時間を超過していたら、Slackに通知する」 かつ、「開始時間を過ぎた場合はもう通知しない」
      if (fiveMinutesBefore < now && now < startTime){

        // 時間をJSTに変換 (GASの標準はUTC)
        var startTimeJST = Utilities.formatDate(startTime, "JST", "HH:mm")

        // Slack送信用メッセージ作成
        var message = startTimeJST + " " + eventName + " " + mention;

        // Slackに通知
        redirecttoslack(message);
      }
    }
  }
}

// Slack通知関数
function redirecttoslack(message) {

    var jsonData =
      {
         "username" : username,
         "icon_emoji": icon,
         "channel": channel,
         "text": message,
         "link_names": 1
      };
      var payload = JSON.stringify(jsonData);
    
      var options =
      {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
      };
    
      UrlFetchApp.fetch(incomingHookUrl, options);

}
// End

登録の仕方

事前準備として、Slack の Incoming Webhook URLを1つ用意してください
参考:Slack でのIncoming Webhook の利用

  1. Googleにログインし、G Suite Developer Hub にアクセスします
  2. 「新しいプロジェクト」をクリックします
  3. 上に記載したコードを貼り付け、「変数定義」部分を自分の環境用に編集し、フロッピーマーク(または [cmd/ctrl] + s キー)を押して保存します
  4. 適当に名前を付けてOKを押します
  5. 「自分のプロジェクト」に作ったプロジェクトがあることを確認し、クリックします
  6. 右の方に出てくる「プロジェクトの詳細」の右上に付いている3つの点マークをクリックします
  7. 「トリガー」をクリックします
  8. 右下にある「トリガーを追加」をクリックします
  9. 以下のように「remindGoogleCalender」関数を「1分おき」に実行するようにして「保存」します
  10. 3分前になると、1分毎にSlackに通知されるようになりました ( 18:07 開始の会議前、18:04, 18:05, 18:06 の合計3回、通知しています )

まとめ

この状態で様子を見ようと思います

Viewing all 1210 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>