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

Transit Gatewayで実現するマルチリージョン構成・マルチアカウント構成

$
0
0

技術三課の杉村です。2019年12月のre:Inventにて、リージョン間のTrasit Gatewayピアリング機能が発表されました。
AWS Transit Gatewayにマルチキャストとインターリージョンピアリング機能を追加

Transit Gateway + Direct Connect にてマルチリージョン構成かつ、マルチAWSアカウント構成ができることになります。
このあたりの機能はアップデートが激しいので、2019/12現在でいったいどんな構成が可能なのか、図に整理しました。

1. 2019/12時点の最新

1-1. 構成イメージ

以下のような構成が可能になります。
Transit Gatewayを経由して、図に登場している全てのリージョン・AWSアカウント・オンプレ拠点が相互に通信できるようになっています。
図には表現していませんが、AWSアカウントが違いかつ別リージョンのTransit Gatewayにも接続できるようになっているはずです。

1-2. 通信可能範囲

通信可能な範囲を図に表現すると、以下の通りです。
図には全ての通信を矢印で表現しきれていませんが、右下のオンプレ拠点から左上のVPCへの通信、などももちろん可能です。
(適切にルート設計がされている前提)

2. Direct Connectの全てを追いきれない…

Direct Connect関連の機能はアップデートが激しいため、仕様を理解しきるのが難しいかもしれません。
以下のブログを順に読んでいくと、分かりやすいかもしれません。

  1. AWS Direct Connectの概念の整理…Connectionとは?VIFとは?
  2. DX系サービスの変遷とAWS Transit Gatewayの嬉しいところ

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

AWSが無料で公開している素晴らしい機能がありますので、上記ブログを読んだうえで下記をご参照いただくと、理解が深まると思います。

[AWS Black Belt Online Seminar] AWS Direct Connect


Cloud AutomatorでEC2インスタンスを冗長化ぽくしたい

$
0
0

たとえば。。。

たとえばこんな構成があるとします。

AWSでバッチ処理を実行するとなるとLambdaやECS、AWS Batchがあると思いますが、要件が合わずこの構成では1台のEC2インスタンスでバッチ処理を定期的に実行しています。

しかし、EC2に障害があった場合どうしましょうか。

SNSで通知を飛ばして再起動なりAMIから復旧なりや、あらかじめHAクラスター製品を導入しておくなどいろいろ考えられますよね。

Cloud Automatorで??

ワタシは思いつきました。

「うちのサービスのCloud Automatorなら冗長化してるぽできるんじゃね??」と。

実際にやってみた

実際にやってみました。

今回は検証としてCloud Automatorのジョブを含めるとこんな感じの構成。

線がががががががが。。。

1つずつ見ていきましょう。

AWS環境

EC2

EC2を2台用意しました。検証用途なのでAmazonLinux2のt3.microです。今回は間違えて同じAZに構築してしまいましたが、異なるAZに配置するのがよいです。

後述しますが、Cloud Automatorの「EC2: インスタンスでコマンドを実行」はSSMのRunCommandを利用するため、インスタンスにSSMエージェントをインストール・適切なIAMロールを付与し、またインターネットもしくはVPCエンドポイント経由でSSMと通信できる必要があります。

SQS

こちらも後述しますが、Cloud AutomatorでSQSを使用します。あらかじめ2つのSQSキューを作成しておきます。

Cloud Automator

Cloud Automatorのジョブは3つ作成しました。

ジョブ1: バッチ用1でコマンド実行

1つ目のジョブはバッチ用1でコマンドを実行するジョブです。

設定項目 補足
トリガー HTTPトリガー 検証のためHTTPトリガーとしてます。本番環境の場合はタイマートリガーとなるでしょう、
アクション EC2: インスタンスでコマンドを実行 SSMのRunCommand経由でインスタンスにて指定のコマンドを実行します。
参考: EC2: インスタンスでコマンドを実行
コマンド echo kore ha test desu 検証なのでテキトー。本番環境ではバッチ処理を実行するコマンドとなります。
実行コマンドの終了ステータスチェック する 「する」の場合、インスタンス内で実行されたコマンドの終了ステータスによってジョブの成功/失敗を判断できます。今回はインスタンスの障害を想定してるので「しない」
参考: 【Cloud Automator】「EC2: インスタンスでコマンドを実行」アクションに終了ステータスチェックオプションを追加しました
インスタンス接続のタイムアウト秒数 - インスタンスへ接続出来ずに失敗とみなすまでのタイムアウト秒数。デフォルトは900秒なので指定しません。
後処理(成功時) - 検証環境なのでなし。本番環境ではせめてEメール後処理くらいあってもよいかも。
後処理(失敗時) SQS後処理
Eメール後処理
SQS後処理で指定のSQSキューにメッセージを送信します。あらかじめ作成しておいたうちの1つを指定します。
参考: SQS後処理

ジョブ2: バッチ用2の起動

バッチ用1でのRunCommand失敗時にバッチ用2を起動するジョブです。

設定項目 補足
トリガー SQSトリガー 指定したSQSキュー内にメッセージがあるとそれをトリガーとします。ここではジョブ1のSQS後処理で指定したキューをトリガーとします。
アクション EC2: インスタンスを起動 指定のインスタンスを起動します。
参考: EC2: インスタンスを起動
リソースの終了ステータスチェック する これを「する」にしておくと、インスタンスの状態が「running」になった場合にジョブが成功したと判断されます
後処理(成功時) SQS後処理 SQS後処理で指定のSQSキューにメッセージを送信します。ジョブ1で指定したものとは別の残りの1つを指定します。
後処理(失敗時) Eメール後処理 バッチ用2の起動の失敗時にメール通知します。その後は手動で何とかするしかないですね。

ジョブ2: バッチ用2でコマンド実行

バッチ用2でのRunCommand失敗時にバッチ用2を起動するジョブです。トリガー以外はだいたいジョブ1と同じです。

設定項目 補足
トリガー SQSトリガー 指定したSQSキュー内にメッセージがあるとそれをトリガーとします。ここではジョブ1のSQS後処理で指定したキューをトリガーとします。
アクション EC2: インスタンスでコマンドを実行 SSMのRunCommand経由でインスタンスにて指定のコマンドを実行します。
参考: EC2: インスタンスでコマンドを実行
コマンド echo kore ha test desu 検証なのでテキトー。本番環境ではバッチ処理を実行するコマンドとなります。
実行コマンドの終了ステータスチェック しない 「する」の場合、インスタンス内で実行されたコマンドの終了ステータスによってジョブの成功/失敗を判断できます。今回はインスタンスの障害を想定してるので「しない」
インスタンス接続のタイムアウト秒数 - インスタンスへ接続出来ずに失敗とみなすまでのタイムアウト秒数。デフォルトは900秒なので指定しません。
後処理(成功時) Eメール後処理 成功のメール通知。
後処理(失敗時) Eメール後処理 失敗のメール通知。その後は手動で何とかするしかないですね。

試してみた

正常なとき

バッチ用1を起動した状態にします。

ジョブ1をHTTPトリガーで実行しました。成功したぽいです。

障害のとき

バッチ用1を削除してみました。

ジョブ1をHTTPトリガーで実行しましたが、失敗しました。

ジョブ2でバッチ用2の起動が成功しました。

ジョブ3のを確認すると、、、成功しています。

念のためRunCommandを確認、、、成功してるぽいです。

まとめ

いかがでしたでしょうか?思いつきで検証してみましたが、実際使うとなるとこの方法はどうなんでしょうか??タイムアウト時間とかは調整しないといけないかもしれませんね。

海外未経験者の英語ド素人がRe:Inventに参加しても超楽しめることがわかったので英語に尻込みしているエンジニアの皆さんにおすすめしたい

$
0
0

どうも。今年10月より、プロセスエンジニアリング部という部署で社内SE的な活動をしている橋本です。

私は海外初心者かつ英語弱者ですが、なんやかんやでがっつりカンファレンスを満喫できました。そんな私がRe:Inventをどう乗り切ったのか、参加してどうだったのかをシェアしようと思います。

なんやかんやで海外カンファレンスって未経験者には敷居が高いと思いますし、この記事で少しでも「俺でも行けそうやん?」と感じる方が増えてくれたら幸いです。

筆者について

おそらくこの記事を見ている方は、ご自身の英語力、技術力、あるいはその両方に不安があるのではないかと思います。そこで、本記事で「なんとかなるよ」と主張している私自身のレベル感をお伝えしておこうと思います。

英語はできません。

どのくらいできないかと言うと、これまで海外旅行の経験すらなく、十数年前の高校時代に受けたTOEICは300点くらい、という有様です。学生時代は英語に対する苦手意識が非常に強く、また学びの対象として興味もなかったので勉強らしい勉強はした記憶がありません。

現在の英語との接点は、技術ドキュメントを漁るときにでGoogle翻訳片手にリーディングする機会が多少、という程度です。ライティングや会話をする機会はないです。

技術方面は、「多少わかる」程度だと思います。

AWSは一応そこそこわかります。が、実感としてここの知識量はさほど重要じゃないです。自分の興味関心があるジャンルに対して知識があれば、それで必要十分だと感じました。日本語カンファレンスに参加するときの判断基準と変わりないです。

前日までの過ごし方

予習として行ったことはそれほど多くないです。気が向いたときにYoutubeを見ながらゆるゆる英語の練習していました。

特に、声を出す練習に重点を置きました。「音をモノマネする」感覚でした。

ネイティブスピーカーの発声に近くなるように、近い「音」の出し方を探していく意識で字幕をなぞっていました。認識できなかった箇所は聞き直して、どのような音の繋がり方だったのかを頭で理解できるようにに努めました(諦めたフレーズも多数ありました)。行き詰まったら発音学習系の動画を見て、理屈をインプットしてから戻ってくる要領です。自分がよく知っている話題の動画を、0.75倍速字幕付きで流しつつ喋るのがおすすめです。

手前味噌ですが、この練習法は中々良い方法だったと感じています。一度やればわかると思いますが、この練習法、脳が疲れて集中力が全然持たないです。じきに音の認識や口の動きがおぼつかなくなります。興味があれば是非やってみてください。

参考までに、私が特にお世話になったYoutubeチャンネルをシェアしておきます。

現地での過ごし方について

後日Youtubeで公開されそうなものはパスして、現地入りしなければできなさそうな体験を重視しました。

いくつかKeynoteを聞いて、あとはGameDay, ハンズオン系統のWorkshopへ参加していました。空き時間にEXPOを眺めたりもしました。

Chalk talkなど、グループで会話するスタイルのセッションには参加しませんでした。次回はここにも飛び込んでみたいですね、、

また、今回はツアーを組んでの参加でした。ツアー中の多くの時間は身近に顔見知りの日本人がいる状況でした。これは非常に大きかったと思います。

結局のところ、行程中で一番困ったのは移動や宿泊時などの手続きでもたついたことでした。ここに関しては、見知った日本人がそばにいる安心感が非常に大きいです。正直ここは単独ではしんどかったと思います。

一方で、カンファレンス中の時間に関しては「スマホの電源とインターネット接続さえ維持していれば、単独行動でもなんとかなる」ということを強く申し上げておきたいです。実際、私はカンファレンス中の自由時間は単独行動で過ごすことが多かったですが、特に大きな支障は感じませんでした。

教訓として得られた以下の2点をお伝えしておきます。

インタネット接続は常に確保できるように準備しておく

コミュニケーションのしやすさと安心感が段違いなので、通信手段を常時確保しておくことは強く推奨します。

  • Google翻訳とGoogleMap, AWS Events(カンファレンス専用アプリ)の画面を常にチェックできる環境が重要
  • 電話は不要だった。テザリング可能な海外SIMか、ポケットWi-Fiが良い
  • SIMだと挿す側の機器が対応してなかったり、Bandが合わなかったりする可能性もある
  • 不安 or 面倒なら海外対応のポケットWi-Fiをレンタルしておくのが良さそう

1対1の簡単な英会話は割とどうにでもなる

僭越ながら、英語できない人間ができないなりに乗り切っていくための付け焼き刃コミュニケーションの助言をしてみます。

ディープなディスカッションはさすがに厳しいですが、Google翻訳さえあれば向こうのEXPOに参加して簡単な製品紹介を受けるぐらいのことはなんとかなると実証済みです。

  • 聞き取れた部分は復唱する
  • 聞き取れる気がしないならGoogle翻訳の音声入力を使う
  • もしくは最初からGoogle翻訳を音声入力状態でONにしてから話しかける

「復唱」は、聞き取り不明な箇所で相手を見つつ言葉を詰まらせて “…ahh…sorry?” とでも言っておけば良いです。困ってそうな仕草でこちらの意図はだいたい伝わります。伝わらないときもあります。

自分から英語を使うときはだいたい何か困っていたり、質問したいときだと思います。このとき、「日本語なら何て言うか」を起点に言葉を組み立てようとしない方がいいです。だいたい脳内作文で詰まります。

「伝えたい意図」あるいは自分の「困っている現状」が伝わればコミュニケーションとしては成功なので、もし脳内作文で詰まったらそれを意識してみるのが良いと思います。綺麗な疑問文なんか作れなくても、スマホを指しながら “I wanna go to here. Do you know…ahh…this?” くらいでもこちらの言いたいことは伝わることが多かったです。会場スタッフが至るところに配置されていますので、彼らに話しかければ大体のことは察してくれます。

苦労したこと

KeynoteやWorkshopのイントロパートなど、プレゼンターが聴衆に喋りかける場面でのリスニングに苦労しました。だいたいの内容はスライド見たほうが理解が早いことが多いです。また、主要なKeynoteでは同時翻訳が付きますので、使える場所ではそれを活用した方が良いです。

途中で文字起こしアプリの力も借りてみました。が、結局リアルタイムで喋っているスピードに文字がついていけない、または文字起こしの精度が素人目に見ても低いので、さほどありがたくなかったです。スライドに図や文字の掲載がなく、声以外の情報源が乏しい場面で使うならアリかなと思います。

また、海外SIMの手配をミスってしまい、通信手段が充実していなかったことも苦労ポイントでした。

会場入りさえしてしまえばWiFi設備があるので大きな問題はないのですが、主に移動中の業務連絡が受け取れなかったり、ネイティブとの会話で困ることになります。スマホ画面を提示しつつ質問できる状況だと意思疎通が非常にしやすいので、安定した通信環境は必須かなと思います。

参加してよかったこと

技術的な研鑽は言うまでもないことですが、海外を体験することで色々な刺激を受けました。

  • 会場の熱量を体験した(特にKeynote)
  • ネイティブと仕事に関連する話題で交流する機会が得られた
  • 気軽に人に頼っていくメンタルを手に入れた
  • 外国人に話しかける心理的ハードルがだいぶ減った

1つ目、2つ目はまぁ普通の感想ですね。この記事を読んでくれている方なら、参加したいモチベとしてここに対する期待値を多少なり持っているはずだと思います。是非来年、現地で体感してください。凄いです(語彙力)

3つ目、4つ目は私の個人的な苦手意識からの感想です。今回カンファレンスに参加したことで随分とこれらの苦手意識は緩和したように思います。これについては、カンファレンス中の単独行動を多めにしていたのが非常に良かったと思います。隣に見知った日本人がいると、どうしてもそこに甘えてしまうんですよね。それだとあまり面白くないので、できれば単独行動の時間を何度か意識的に取ってみることをおすすめします。

まとめ

カンファレンス中はスマホのインターネット環境だけ確保しておけばどうにかなります。電源はさほど心配いらないと思いますが、不安ならモバイルバッテリーを持参しましょう。

カンファレンス以外の部分(移動や宿泊など)に関してはツアーを使えばいかようにもなります。慣れてないならツアー使いましょう。本編以外の不安要素はできるだけ排除したほうがよいです。なお、当社も毎年自社でツアーを組んでおりますのでご参考まで。

帰国した今も依然英語への苦手意識はありますが、それ以上にもっと海外の技術者と交流できるようになりたい、そのために英語を学びたい…と思う自発的な気持ちが強くなりました。今回の経験で一番良かったのはそうしたメンタルの変化かなと思います。

AWS未経験でしたが2ヶ月でAWSアソシエイト3冠を達成することができました!

$
0
0

ボクシングの井上尚弥選手のバンタム級統一戦が正式決定して興奮しているCI部5課の山﨑です。

先日AWS Developer Associate(以下、DVA)試験に合格し、入社2ヶ月以内にAWSアソシエイト3冠という目標をすることができたので、今回はこの目標を設定するに至った経緯やアソシエイト攻略法についてお伝えしたいと思います

過去に取得したAWS Solution Architect Associate(以下、SAA)とAWS Sysops Administrator(以下、SOA)の勉強方法については下記ブログにまとめていますので、ご興味がある方は合わせてご覧頂けると嬉しいです

AWS未経験/入社3週間でAWS SAA試験に合格できた勉強法(2019年)
AWS未経験/入社1ヶ月半でAWS SOA試験に合格できた勉強法(2020年)

私のバックグラウンド

まず初めにAWSアソシエイトの勉強を始める前の私のバックグラウンドを簡単にお伝えしたいと思います。

  • 私立大学の文系学部卒
  • 新卒で入社した会社で営業(約4年半)
  • Webエンジニア(約半年)

ということで、AWSはおろかインフラ関連の技術にもノータッチという状態でした。

なぜ2ヶ月以内にAWSアソシエイト3冠を目標にしたのか

私が2ヶ月以内にアソシエイト3冠を目標にした理由は3つあります

  • AWSクラウドエンジニアとしての基礎知識を習得するため
  • AWSの知識レベルを客観的に証明することができるため
  • ボクシングの3階級制覇みたいな感じでカッコいいと思ったため笑

AWSクラウドエンジニアとしての基礎知識を習得するため

「基礎知識の習得」と一言で言ってしまえば当たり前の話ですが、これがないと下記の3つの困り事が発生することは目に見えていました。

  • 基礎知識がないと社内メンバーの会話が理解できない
  • 基礎知識がないと詰まった時に、何が分からないかが分からなくなる
  • 基礎知識がないと先輩に質問したい時に上手く質問ができない(何をどう聞けば良いか分からない)

これらは私が半年間Webエンジニアとして仕事をしていた時にまさに困っていた事でした。 前職も完全未経験でエンジニアに転身したこともあり基礎知識がありませんでした。早期に知識を付けようと技術書を読み漁ったりしていましたが、MTG等で先輩エンジニアが何の話をしているのかが全く理解できませんでした。会話の途中で「それって何ですか?」と毎回聞いていると日が暮れてしまいそうなくらいに分からないことだらけだったので、遠慮してしまい聞くことができませんでした。

また、開発で詰まった際に「何が分かっていて、何が分からないのか」という切り分けをすることができずに仮説を立てることすらままならない状態でした。結果として、先輩エンジニアに質問をしたくても上手く質問することができませんでした。そんなことにならないように早々に布石を打とうと思い、自分自身の最も高いモチベーションが継続する最長期間として2ヶ月という期限を設定しました。これ以上長い期間を設定すると、間違いなくモチベーションが低下していたと思います。

AWSの知識レベルを客観的に証明することができるため

私と同期入社したメンバーはAWSの実務未経験だったものの過去に何かしらインフラに関わった経験を持っている方ばかりだったので、入社初日から危機感MAXでした。過去の経験は変えることはできません。だからこそAWSという分野において同期メンバーよりもスタートダッシュしたいと思いました。そこでスタートダッシュの指標として資格取得が最も分かりやすく、目標として追いやすいと考えました。

ボクシングの3階級制覇みたいな感じでカッコいいと思ったため笑

なんじゃそりゃ、って感じですがこれは結構大きいです。モチベーションには大きく2つのタイプがあると思います。

  • 外部環境から必要にかられて発生する外的モチベーション
  • 自分がやりたい、なりたいと思うことで発生する内的モチベーション

今回は完全に内的モチベーションですね! もちろんAWSに興味があってサーバーワークスにジョインしたので、学習におけるモチベーションは基本的に内的モチベーションですが、「3階級制覇みたいな感じでカッコいいと思った」みたいな直感的な動機付けって意外と心を突き動かしますww

アソシエイト3冠達成までの攻略法

ここからはアソシエイト3冠を達成するにあたって私が思う攻略法、学習方針をお伝えしたいと思います。

アソシエイト試験を受ける順番について

  • SAA → SOA → DVA(私はこっちでした)
  • SAA → DVA → SOA

私はまずはSAAから受験することをお薦めします!
理由はシンプルでSOAとDVAの試験範囲を包含しているのがSAAだからです。

始めにSAAの試験範囲をしっかりと学習することでSOA、DVAの学習理解に繋がります。
私はSAAに1ヶ月、SOAとDVAにそれぞれ2週間の時間を費やしました。

各試験の教材と勉強方法について

AWS Solution Architect Associate(SAA)

SAAの勉強方法については下記ブログにまとめていますので、是非ご覧ください。
AWS未経験/入社3週間でAWS SAA試験に合格できた勉強法(2019年)

AWS Sysops Administrator(SOA)

SOAの勉強方法については下記ブログにまとめていますので、是非ご覧ください。
AWS未経験/入社1ヶ月半でAWS SOA試験に合格できた勉強法(2020年)

AWS Developer Associate(DVA)

教材
勉強方法

模擬試験問題集を1回分解く → 正解率30%で青ざめる

模擬試験で自分が理解していないと思ったAWSサービスについて、SAA試験でも使用していたUdemyの動画教材を見直したり、AWS サービス別資料のYoutubeを見たりPDF資料を読んで理解を深める

どうしてもイメージできない部分は、ハンズオンで実際に触ってみる

模擬試験問題集を2回分解く

この先は上記と同じことの繰り返し

AWSサービス別資料では下記のサービスについてチェックしていました。

  • DynamoDB
  • API Gateway
  • Lambda
  • X-Ray
  • Elastic Beanstalk
  • CloudFormation
  • ECS
  • KMS
  • Codeシリーズ全部

SAAとSOAの資格を取得した際に書いたブログにも書いていますが、意識していたのは反復学習です。1回勉強しただけでは理解することはできないので、何度もインプットとアウトプットを繰り返して学習することが合格の近道だと思います。

アソシエイト3冠を達成したことで実務面で変化はあったのか

悲しいかな、アソシエイト3冠したからといって実務能力が向上した実感はありません笑

しかし、上述した3つの困り事を感じることはなくなりました。

  • 基礎知識がないと社内メンバーの会話が理解できない
  • 基礎知識がないと詰まった時に、何が分からないかが分からなくなる
  • 基礎知識がないと先輩に質問したい時に上手く質問ができない(何をどう聞けば良いか分からない)

そして下記のような変化がありました。

  • 社内Slackで流れる技術的な会話を何となく理解できるようになってきた
  • 案件開始時に見積書等のドキュメントを見て、自分が分かる(あるいは調べれば分かりそうなところ)と分からないところをざっくりと切り分けることができるようになってきた
  • 先輩エンジニアに質問する際に、内容を整理して質問することができるようになってきた

まとめ

2ヶ月間は資格の勉強漬けの日々でしたが、結果として少しずつ実務を進めやすくなってきている実感があります。
資格を取得したからと言って実務能力が即時に向上する訳ではありませんが、基礎知識は必ず付きますし、何より自信に繋がります。
AWSに携わっている方もそうでない方も、資格試験の勉強をすることでAWSサービスの大枠を掴むことができるのでお薦めです!

ACMでプライベートCAを作成して証明書を発行してみた

$
0
0

こんにちは。ポインコと暮らしているエンジニアの高橋です。
今回はACMでプライベートCAを作成し、証明書を発行してみます。

プライベートCA(認証局)とは

SSL/TLSサーバー証明書を発行するのが認証局(CA)ですが、CAには大きく分けてパブリックとプライベートとがあります。パブリックCAは監査法人によって認められた信頼された機関で、一般的なWebサイトにはこのパブリックCAの証明書が使用されます。一方、プラべートCAは誰でも構築することができる独自のCAです。社内システムに適用することなどが考えられます。

ACMとは

ACMは「AWS Certificate Manager」の略で、SSL/TLS 証明書を作成/管理したり、CAを作成してプライベート証明書を発行することができるサービスです。
https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/acm-overview.html

ACMの料金

ACMでプロビジョニングしたSSL/TLS 証明書は無料なのですが、プライベートCAについては料金が発生します。結構高額なので注意しましょう!(Amazonプライムと同じで初回は30日間無料です)

プライベートCAの料金:毎月400 USD(日割計算)
プライベート証明書の発行:

月/リージョンで作成されたプライベート証明書の数 料金 (証明書当たり)
1~1,000 0.75 USD
1,001~10,000 0.35 USD
10,001~ 0.001 USD

プライベートCA作成

それでは早速プライベートCAを作成していきましょう。ACMの画面からプライベートCAを選択して作成を開始します。

認証機関のタイプ

ルートCAなのか下位CAなのかを選択します。以前は下位CAのみの対応だったようですが、ルートCAも選択できるようになりました。今回は社内運用を想定し、ルートCAとして作成します。

認証機関(CA)名の設定

組織や組織単位、住所、証明機関名を入力します。日本語もOKですが、英語が無難です。

証明機関(CA)のキーアルゴリズムの設定

暗号化方式を選びます。

証明書の失効の設定

証明書失効リスト(CRL)を自動的に作成するかどうかを選択します。CRLはS3に作成されるようです。今回は有効にしませんでした。

タグの追加

好きなタグを付けましょう。

CA許可を設定

突然ステップ番号が表示されて(?)ですが、ACMからCAへのアクセスを許可することで、証明書の自動更新ができます。あとからでも設定変更可能です。

確認画面

最後に設定を確認して、課金されるけどほんとにいい? って問いに同意して作成します。

できました。

ルートCA証明書

続いてルートCA証明書を作成、インストールしましょう。

有効期限と署名アルゴリズムを選択し、さくっとインストールします。

完了です。

プライベート証明書の発行

プライベートCAの準備がととのったので、プライベート証明書を発行してみましょう。
Certificate Managerから証明書のリクエストをおこないます。プライベート証明書のリクエストを選択します。

先ほど作成したルートCAを選び…

証明書を使って保護したいドメインを入力します。

あとは確認して…

正常にリクエストされましたね。

証明書をエクスポートする

証明書が発行できたので、Certificate Managerから該当の証明書を選び、エクスポートしましょう。(プライベート証明書のみエクスポートできます)

この際、証明書のプライベートキーを暗号化するためのパスフレーズが必要です。

このパスフレーズにはハマりポイントがあり、以下の条件を満たす必要があります。
・4 ~ 128文字
「%#&+」の4つの記号が使用不可

この4つの記号についての情報は記載されていません。当社社員がAWSサポートに問い合わせて得た情報です。いくつか試してみましたが、これらの記号が含まれていてもエクスポートが可能な場合があるため、注意が必要です。当該記号が何文字か含まれているとエクスポートには失敗しましたが、1文字だけだと成功するケースもあり、、あるいはエクスポートできても正常に復号化できないのかもしれません。「%#&+」は含まないことをお薦めします。

エクスポートした証明書の形式

エクスポートした証明書は、pemファイルになっています。
マネジメントコンソールでエクスポートした場合は「証明書本文」「証明書チェーン」「証明書のプライベートキー」ごとにファイルが異なります。
後述するCLIでエクスポートした場合は1ファイルになっていて、先頭から「証明書本文」「証明書チェーン」「証明書のプライベートキー」が連続して書かれています。

※CLIでエクスポートした場合のpemファイル例

-----BEGIN CERTIFICATE-----
HOGEhogeHAgeHeGEHEgeHOGEhogeHAgeHeGEHEgeHOGEhogeHAgeHeGEHEge
HOGEhogeHAgeHeGEHEgeHOGEhogeHAgeHeGEHEgeHOGEhogeHAgeHeGEHEge
.....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
PoyoPOYOPPPOpoyoPoyoPOYOPPPOpoyoPoyoPOYOPPPOpoyoPoyoPOYOPPPO
PoyoPOYOPPPOpoyoPoyoPOYOPPPOpoyoPoyoPOYOPPPOpoyoPoyoPOYOPPPO
.....
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
DekoBOKOEDkobokODekoBOKOEDkobokODekoBOKOEDkobokODekoBOKOEDko
DekoBOKOEDkobokODekoBOKOEDkobokODekoBOKOEDkobokODekoBOKOEDko
.....
-----END ENCRYPTED PRIVATE KEY-----

証明書をインストールするOSがLinux系であれば、大抵の場合この形式で問題ないですが、Windowsの場合だとcer形式やpfx形式などに変換する必要があります。
詳細は割愛しますが、今回はpfx形式にしたかったため、OpenSSLを使って以下のコマンドで変換しました。(CLIでエクスポートしている場合は、自分でファイルを分割しましょう)

openssl pkcs12 -export -out certificate.pfx -inkey private_key.txt -in Certificate.txt -certfile Certificate_chain.txt
Enter pass phrase for private_key.txt:
Enter Export Password:
Verifying - Enter Export Password:

エクスポート際のプライベートキー用パスフレーズを訊かれ、更にエクスポートのパスワードを入力しろと言われます。エクスポートのパスワードはインポート時に必要になります。

数が多くてエクスポートがめんどくさいのでPowerShellでバッチ処理にする

証明書は無事使えるようになりましたが、この証明書をクライアント証明書として複数のPCにインストールする場合、マネジメントコンソールからでは結構しんどいのでCLIを使って自動化してみました。パスフレーズはランダムで生成していますが、便宜上コンソール上で表示してしまってたり、CSVに保存しているので、あくまで参考としていただければ幸いです。

# AWS CLIで使いたいAWSアカウントに設定しておく

Param(
    [Int]$CertNum    = 1,  # 発行する証明書の数
    [String]$CertArn = ""  # プライベートCAのARN
)

# パスフレーズ出力用CSVつくる
Set-Content -Encoding Default -Value "パスフレーズ" -Path "passphrase.csv"

# エクスポート繰り返し
for($i = 1; $i -le $CertNum; $i++){

    # エクスポートするファイル名称用
    $num = $i.ToString("000")

    # パスフレーズ生成
    #  以下の情報から、使用文字を絞る
    #    ・AWS ACM から証明書をエクスポートする際のパスフレーズに「%#&+」の 4 つの記号が使用不可
    #    ・PowerShellでは、ハイフン(「-」)で始まり途中にピリオド(「.」)を含む文字列があると、ピリオドの前で分割してしまう
    $pass = @(Add-type -AssemblyName System.Web;[System.Web.Security.Membership]::GeneratePassword(16,0)) `
            | %{$_ -replace "[^a-z0-9!""$'()*,./:;<=>?@[\]^_`{|}~]","0"}

    # パスフレーズまとめ用CSVにめも
    Add-Content -Encoding Default -Value $pass -Path "passphrase.csv"

    # プライベート証明書のエクスポート
    # https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/gs-acm-export-private.html
    If(Test-Path "Certificate$num.pem"){
        Remove-Item "Certificate$num.pem"
    }
    aws acm export-certificate --certificate-arn $CertArn `
    --passphrase $pass | jq -r -j "(.Certificate,.CertificateChain,.PrivateKey)"  `
    | Set-Content -Encoding Default -Path "Certificate$num.pem"

    # エクスポートできたかチェック
    If(!(Test-Path "Certificate$num.pem")){
        Write-Host "あかーん エクスポートできなかったんや!"
        exit
    }

    Write-Host "パスフレーズ $pass でエクスポートしたで! ($i / $CertNum)"
}

プライベート証明書のエクスポート
https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/gs-acm-export-private.html

あとがき

プライベートCAを作成して、証明書を発行、エクスポート等等をおこなってみました。
プライベートCAの感想ではないですが、今回はじめてPowerShellを使ってみて、色々なことができることにちょっと感動でした!

なお、プライベートCAを削除しても証明書は無効化されませんので、配布した証明書は削除するか、あるいはCAを再構築して証明書を再発行するなどの処置が必要です。

さいごに、お試し中の方は無料トライアル期間中に削除することをお忘れなく、と兄が言っていました。それではまた、ごきげんよう。

Amazon API Gateway + AWS Lambda でのレスポンス形式

$
0
0

はじめに

こんにちは、技術一課の山中です。
冬は好きではないですが、夏は嫌いです。

さて、 Amazon API Gateway + AWS Lambda で REST API を構築することは多々あるとおもいますが、 Lambda プロキシ統合をセットアップした際に、 AWS Lambda からどのような形式でレスポンスを組み立て返せばいいのか、忘れてしまうことはありませんか?

API Gateway の Lambda プロキシ統合をセットアップする

少なくとも私は覚えることができないので、いっつも調べています。
というわけで、自分自身の備忘録がてらここに残しておくことにします。

Lambda 関数のレスポンス形式

プロキシ統合のための Lambda 関数の出力形式 には、以下のように記載があります。

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..."
}

この中で、 statusCode が必須なので、 Python で正常レスポンスを返すだけであれば、 Lambda 関数の中身は以下のように書けば良さそうです。

def lambda_handler(event, context):
    return {
        'statusCode': 200,
    }

もし body を加える場合はこのようになります。

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Amazon API Gateway から呼んでみる

Amazon API Gateway + AWS Lambda の構成で実際に呼んでみます。
まずは、 Lambda 関数に以下をデプロイし実行します。

def lambda_handler(event, context):
    return {
        'statusCode': 200,
    }

レスポンス結果は以下のとおりです。

$ curl -I https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default/apigw-sample
HTTP/2 200
date: Fri, 07 Feb 2020 00:49:48 GMT
content-type: application/json
content-length: 0
x-amzn-requestid: HgEW9i8QIAMEAAQ=

ためしに、 statusCode を 404 に変更してみます。

def lambda_handler(event, context):
    return {
        'statusCode': 404,
    }

レスポンス結果は以下のとおりです。

$ curl -I https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default/apigw-sample
HTTP/2 404
date: Fri, 07 Feb 2020 00:52:33 GMT
content-type: application/json
content-length: 0
x-amzn-requestid: HgEwvjJ7IAMEAAQ=

当然 500 に変更しても同様の結果が得られます。

$ curl -I https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default/apigw-sample
HTTP/2 500
date: Fri, 07 Feb 2020 00:53:20 GMT
content-type: application/json
content-length: 0
x-amzn-requestid: HgE3_jNvIAMEAAQ=

body を加えた場合のレスポンスは

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

以下のとおりです。

$ curl https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default/apigw-sample
"Hello from Lambda!"

最後に

Amazon API Gateway + AWS Lambda で作成する REST API で Lambda 関数のテストをしたいけど、レスポンスどうすればいいんだっけ?と考える時間がもったいないので、そんなときはこの備忘録を見ていこうと思います。

暗号化されたEBSスナップショットを別リージョンへコピー

$
0
0

こんにちは、技術1課の小倉です。
2019年12月に課が変わりました。業務内容が大きく変わり、新しく覚えなければいけないことが多いので、勉強の日々を過ごしています。

今年の5月にAWS 認定ソリューションアーキテクト – プロフェッショナルの有効期限が切れるので、更新のための勉強も進めています。整理のために勉強している内容をまとめておきます。

EBSスナップショットの暗号化

EBSのスナップショットを暗号化する理由としては、意図せず権限をパブリックに変更できないようにするためがあります。
権限をパブリックにしてしまうと、すべてのAWSアカウント上で、そのスナップショットを使ってEBSボリュームを作成できるようになります。もし、そのスナップショットに重要なデータが入っていたら、情報が漏洩してしまいます。

暗号化されていないEBSボリュームのスナップショットを暗号化するには以下の手順が必要です。

  • 暗号化されていないスナップショットの作成
  • 作成したスナップショットを暗号化してコピー

まず、EBSボリュームからスナップショットを作成します。
ナビゲーションペインの[ボリューム]を選択し、[アクション] – [スナップショットの作成]をクリックします。

スナップショットの作成画面になるので、[スナップショットの作成]をクリックします。
ここでは暗号化の指定はできません。

[閉じる]をクリックします。
ナビゲーションペインの[スナップショット]をクリックすると作成したスナップショットを確認できます。

作成したスナップショットをコピーします。
対象のスナップショットを選択し、[アクション] – [コピー]をクリックします。

スナップショットのコピー画面で以下を選択し、[コピー]をクリックします。
 送信先リージョン : 送信元リージョンと一緒
 暗号化 : チェック入れる
 マスターキー : KMSキー(ogurakms)を指定

閉じるをクリックします。
これでスナップショットを暗号化することができました。

暗号化されたEBSスナップショットを別リージョンへコピー

暗号化されたスナップショットを選択して、[アクション] – [コピー]をクリックします。
(コピー元は東京リージョン)

スナップショットのコピー画面で以下を選択し、[コピー]をクリックします。
 送信先リージョン : Asia Pacific (Seoul)
 暗号化 : チェック(変更不可)
 マスターキー : KMSキー(ogurasoul)を指定
 ※KMSキーはソウルリージョンのキーです。

閉じるをクリックします。
ソウルリージョンにスナップショットがコピーされました。

手順はとても簡単ですが、リージョン間をコピーしているときは暗号化されているのかという疑問がでてきます。KMSキーは作成したリージョンでしか使えません。ですから、リージョン間コピーするときは以下の動きをしているはずです。

 東京リージョンのスナップショットを東京リージョンのKMSキーで復号
  ↓ リージョン間コピー
 ソウルリージョンにコピーされたスナップショットをソウルリージョンのKMSキーで暗号化

ドキュメントを確認するとコピーはS3のSSE-S3を使って暗号化しているとのことです。
Amazon EBS スナップショットのコピー

1 つの AWS リージョンから別のリージョン、または同じリージョン内にスナップショットをコピーできます。Amazon S3 サーバー側暗号化 (256 ビット AES) により、スナップショットの送信中データがコピー操作中に保護されます。スナップショットコピーは、元のスナップショットの ID とは異なる ID を受け取ります。

また、アカウント間の暗号化されたEBSスナップショットのコピーは手順が異なりますが、AWSの公式ブログに手順が書いてありますので、こちらを参考にしてみてください。
【新機能】 暗号化された EBS スナップショットのクロスアカウントコピー

まとめ

EBSスナップショットの暗号化について理解が深まりました。
今後は学んだことを定期的にアウトプットしていきます。

Redmineのチケットを複数条件でフィルタした結果をAPIで取得してみる

$
0
0

こんにちは。技術5課の松尾です。
節分は小袋入りのワサビ味の柿の種を袋ごと撒きました。袋ごと撒くと、忘れた頃にソファの下から豆が出てくるといったアクシデントに合わないので長年オススメしているのですが、同意してくれる人は少数です。
さて、こんなめんどくさがりの私ですが、Redmineのチケット確認をWebで行なうのが面倒でした。そこでAPIで何とかしてみました。

Redmineのチケットを探すのが面倒だった

日々のチケット管理では下の画像のように、「ステータス」「優先度」「担当者」など様々なフィルタを駆使し、見るべきチケットを検索しますよね。

フィルタ条件が増えれば増えるほど、定期的にチケット有無の確認の為だけにRedmineを開くのが私には面倒に感じました。

ちなみに、Redmineにはカスタムクエリという便利機能があります。カスタムクエリとは、よく使用するフィルタを登録しておく機能のことです。
カスタムクエリについてはこちらを参照してください。

複数条件でフィルタした結果をRedmineのAPIで取得してみる

Redmine API

RedmineではAPIが使用でき、XML形式とJSON形式をサポートしています。
Redmine API

APIアクセスキーの取得

APIを使用するにあたり、APIキーが必要になります。
Redmineの右上にある「個人設定」をクリックすると以下のような画面になるので、右下の「APIアクセスキー」の「表示」をクリックします。

APIキーが表示されます。
このAPIキーを使用するので、コピーしておきます。

もしAPIキーが表示されない場合はRedmineのシステム管理者でAPIの有効化が必要です。

curlコマンドでAPIをたたく

まずはチケット一覧を取得してみる

では、curlコマンドでAPIをたたき、チケット一覧を取得してみましょう。
こちらのページでどのようにAPIを使用するのか確認します。

GET /issues.[format]

でチケット一覧が取得できそうです。

今回はjson形式で取得したいので以下コマンドを実行します。

curl --header 'X-Redmine-API-Key:自分のAPIキー'\
 'https://xxxxx.com/redmine/projects/xxxxx/issues.json?'

  • X-Redmine-API-Key には先ほどコピーしておいたAPIキーを貼り付けます。
  • Redmineのチケット一覧のURLは適宜読み替えてください。

以下のようにズラズラと出力されます。非常に見にくいです。

jsonをjqコマンドで見やすくしてみる

jqコマンドは、jsonをいい感じにフィルタしてくれます。
早速実行してみます。

curl --header 'X-Redmine-API-Key:自分のAPIキー'\
 'https://xxxxx.com/redmine/projects/xxxxx/issues.json?' | jq .

以下のように整形されて出力されます。見やすくなりました。

複数のフィルタで絞り込んだ結果を取得する

さて、ここからが本題です。
チケット一覧からステータスや作成日等の複数のフィルタで絞り込んだ結果を取得します。
このページを参照し、試行錯誤しましたが上手いこと出力されませんでした。

諦めてしまいたい気持ちになりながら閃いたのは、「curlってURL指定しているんだから、フィルタしたした際に表示されているURL使ってしまえばいいのでは?」でした。
ということで、チケット一覧からステータスや作成日等の複数のフィルタで絞り込んだ際にアドレスバーに表示されているURLをコピーします。

curlコマンドでAPIを叩いてみます。

curl --header 'X-Redmine-API-Key:自分のAPIキー'\
 'チケット一覧からステータスや作成日等の複数のフィルタで絞り込んだ際に
アドレスバーに表示されているURL' | jq .

無事取得できました!

ちなみに、出力結果からチケットIDだけを取り出したい場合は以下のようにします。

curl --header 'X-Redmine-API-Key:自分のAPIキー'\
 'チケット一覧からステータスや作成日等の複数のフィルタで絞り込んだ際に
アドレスバーに表示されているURL' | jq '.issues[] .id'

まとめ

Redmineへのログインさえ面倒だったり時間が取れない際は、このようにAPIを叩いてslackなどに通知すると楽ちんですね!


SESのSMTPインターフェースでメール送信

$
0
0

EC2インスタンスからメールを送信したいという要望は時々出てきます。
AWSのメール送信サービスには、SES(Simple Email Service)があります。
SESでメール送信するには、「1.AWSのAPIを利用する」「2.SMTPインターフェースを利用する」の2通りがあります。
今回は後者のやり方を試してみました。

今回の構成

東京リージョンにはSESのSMTPエンドポイントがないため、今回はムンバイにしてみました。
海外リージョンを使いますが、メールというアプリケーション特性上、少々の遅延は問題はないかと思います。

ちなみにSESにはメール受信用に、受信エンドポイントというのもあるのですが、ムンバイは含まれていません。
利用可能なSESのエンドポイントはこちらに記載があります。

SESの設定

SESインスタンスの作成といったものはなく、基本的に必要な作業はメールアドレスの認証ユーザー名・パスワードの取得のみです。

メールアドレスの認証

送信元メールアドレスの認証は、必須です。

SES > Email addresses > Verify a New Email Address

送信元メールアドレスを入力します。
基本的にどんなメールアドレスでもいいのですが、このすぐ後に確認メールが届くので、自分で受け取れるものにしましょう。

確認メールを受け取ったら、URLが記載されているので、そちらにアクセスします。

認証されました。

検証に成功しました

メールアドレスの確認に成功しました。このアドレスからのメール送信を開始できます。

Amazon SES の新規ユーザーの場合–上限緩和をまだ申請していない場合は、引き続きサンドボックス環境を使用しています。そのため、メールは確認済みのアドレスにのみ送信できます。新しいメールアドレスまたはドメインを確認するには、Amazon SES コンソールの [Identity Management] のセクションを参照してください。

こちらの文面の通りなんですが、サンドボックス環境にいる場合は、送信先メールアドレスにも制限がかかります。
状況に応じて、メールアドレスの認証の追加や、上限緩和申請をしましょう。

認証されると、Verifiedとなります。

ユーザー名・パスワードの取得

SESのSMTPインターフェースを使う場合、SMTP認証(SMTP AUTH)は必須です。
SMTP認証では、ユーザー名とパスワードのペアで認証されますが、SESはそれにIAMユーザー(のアクセスキーとシークレットアクセスキー)を利用します。

SES > SMTP Settings > Create My SMTP Credentials

IAMユーザーを作成するので、IAMユーザー名を入力します。
やや混乱しやすいのですが、このIAMユーザー名はメール送信の際は使わないですし、送信元メールアドレスとも関係がありません。
SMTP認証のユーザー名は、IAMユーザー名ではなく、アクセスキーとなります。

作成ボタンを押すと、SMTPユーザー名とSMTP パスワードが表示されます。
これをメモして、SES側の設定は完了です。

EC2インスタンスの構築

EC2インスタンスからSMTPインターフェースを利用する条件

Amazon Linux 2から、メールを送信できるようにします。
どんなメール送信ソフトやSMTPライブラリを使うかによって設定は異なりますが、以下の条件をクリアする必要があります。

  • SMTP認証を使い、IAMユーザーのアクセスキーとシークレットアクセスキーを指定する
  • TLSを使う
  • SESのエンドポイントを指定する
  • ポート番号を587に指定する(25も可能ですが、E メール送信制限解除申請が必要)
  • 送信元メールアドレスにはSESで認証済みのものを指定する

mailxの導入

今回は、mailxコマンドを使って試してみました。

mailxのインストール

$ sudo yum install mailx

~/.mailrc

set smtp-use-starttls
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
set smtp=smtp://email-smtp.ap-south-1.amazonaws.com:587
set smtp-auth=login
set smtp-auth-user=AKIAXL4UENVWADS7RB7X
set smtp-auth-password=BPONGFkunZrQ2ZrKFPqAn1D5OTu4EcOxkBaqozixsPnl
set from=xxxxxxx@serverworks.co.jp

メール送信してみる

sh-4.2$ echo "Test" | mailx -v -s "MySubject" xxxxxxxx@gmail.com
Resolving host email-smtp.ap-south-1.amazonaws.com . . . done.
Connecting to 13.233.47.18:587 . . . connected.
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-0OFIHHU41 dHqm8Mo95o43bT6wE5Kd
>>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal
250-email-smtp.amazonaws.com
250-8BITMIME
250-SIZE 10485760
250-STARTTLS
250-AUTH PLAIN LOGIN
250 Ok
>>> STARTTLS
220 Ready to start TLS
Error in certificate: Peer's certificate issuer is not recognized.
Comparing DNS name: "email-smtp.ap-south-1.amazonaws.com"
SSL parameters: cipher=AES-256-GCM, keysize=256, secretkeysize=256,
issuer=CN=Amazon,OU=Server CA 1B,O=Amazon,C=US
subject=CN=email-smtp.ap-south-1.amazonaws.com
>>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal
250-email-smtp.amazonaws.com
250-8BITMIME
250-SIZE 10485760
250-STARTTLS
250-AUTH PLAIN LOGIN
250 Ok
>>> AUTH LOGIN
334 VXNlcm5hbWU6
>>> QUtJQVhMNFVFTlZXQURTN1JCN1g=
334 UGFzc3dvcmQ6
>>> QlBPTkdGa3VuWnJRMlpyS0ZQcUFuMUQ1T1R1NEVjT3hrQmFxb3ppeHNQbmw=
235 Authentication successful.
>>> MAIL FROM:
250 Ok
>>> RCPT TO:
250 Ok
>>> DATA
354 End data with .
>>> .
250 Ok 0109017023c52050-12aa6cdb-2c6e-4095-8685-58690b17242e-000000
>>> QUIT
221 Bye

送信できました。

(おまけ)証明書エラーについて

メール送信できましたが、よく見ると証明書のエラーが出ています。

Error in certificate: Peer's certificate issuer is not recognized.

実は.mailrcの設定で、証明書の検証でエラーが出ても先に進めるように set ssl-verify=ignoreを入れていました。
その設定を削除すると、以下のように送信失敗します。

$ echo "Test" | mailx -v -s "MySubject" xxxxxxxx@gmail.com
Resolving host email-smtp.ap-south-1.amazonaws.com . . . done.
Connecting to 13.126.45.56:587 . . . connected.
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-T9PA1RU41 Y9WzztsfONEbNIg9Im9o
>>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal
250-email-smtp.amazonaws.com
250-8BITMIME
250-SIZE 10485760
250-STARTTLS
250-AUTH PLAIN LOGIN
250 Ok
>>> STARTTLS
220 Ready to start TLS
Error in certificate: Peer's certificate issuer is not recognized.
Continue (y/n)? SSL/TLS handshake failed: Peer's certificate issuer is not recognized.
"/home/ssm-user/dead.letter" 11/327
. . . message not sent.

証明書のエラーを出さないためには、ルート証明書をインポートする必要があります。
Amazon SES + mailx で「Error in certificate: Peer’s certificate issuer is not recognized.」が出た時の対処法を参考にして、再度メールしてみた結果が以下となります。

$ echo "Test" | mailx -v -s "MySubject" xxxxxxxx@gmail.com
Resolving host email-smtp.ap-south-1.amazonaws.com . . . done.
Connecting to 52.66.150.235:587 . . . connected.
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-PDKSW5U41 lxHo3D7G8mDO6lvq0XtE
>>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal
250-email-smtp.amazonaws.com
250-8BITMIME
250-SIZE 10485760
250-STARTTLS
250-AUTH PLAIN LOGIN
250 Ok
>>> STARTTLS
220 Ready to start TLS
Comparing DNS name: "email-smtp.ap-south-1.amazonaws.com"
SSL parameters: cipher=AES-256-GCM, keysize=256, secretkeysize=256,
issuer=CN=Amazon,OU=Server CA 1B,O=Amazon,C=US
subject=CN=email-smtp.ap-south-1.amazonaws.com
>>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal
250-email-smtp.amazonaws.com
250-8BITMIME
250-SIZE 10485760
250-STARTTLS
250-AUTH PLAIN LOGIN
250 Ok
>>> AUTH LOGIN
334 VXNlcm5hbWU6
>>> QUtJQVhMNFVFTlZXQURTN1JCN1g=
334 UGFzc3dvcmQ6
>>> QlBPTkdGa3VuWnJRMlpyS0ZQcUFuMUQ1T1R1NEVjT3hrQmFxb3ppeHNQbmw=
235 Authentication successful.
>>> MAIL FROM:
250 Ok
>>> RCPT TO:
250 Ok
>>> DATA
354 End data with .
>>> .
250 Ok 0109017023ce650b-f193f175-f425-417e-90ca-8eb3b6889beb-000000
>>> QUIT
221 Bye

マネジメントコンソールでスイッチロールした場合は強制サインアウトしません!

$
0
0

こんにちは。ポインコと暮らしているエンジニアの高橋です。
先日の節分、弟が恵方巻を食していましたが、今回はそれに関連してスイッチロールの小ネタです。

AWSマネジメントコンソールのログインセッション

AWSマネジメントコンソールにサインイン後、12時間が経過すると以下のようにログインセッションが失効し、強制サインアウトします。

よくある質問 / セッションはいつ失効しますか?
https://aws.amazon.com/jp/console/faqs/

スイッチロールした場合

ではマネジメントコンソールでスイッチロールした場合はどうなるか? 私は以下の情報から1時間で同様にセッションが切れると思っていたのですが…

IAM ロールを使用する / ロールを使用するためのメソッドの比較
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use.html

強制サインアウトしません!

正確にはログインセッションの有効期限は切れるのですが、認証情報が自動的に更新されるそうです。よって、1時間経過しても「もう一度サインインしてください」と言われることはありません。なぜ1時間の有効期限があるのに自動的に更新されるのかは謎ですが、そういう仕様になっています。(2020年2月現在)

強制サインアウトしたい場合はどうすればいいのか

強制サインアウトの代替案としては、カスタムIDブローカーを使用する方法があります。

カスタム ID ブローカーに対する AWS コンソールへのアクセスの許可
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html

詳しい手順はドキュメントを参照していただきたいですが、(自動更新されない)セッション有効期限付きマネジメントコンソールのURLを生成することができます。URLのセッション有効期限は900秒(15分)から43200秒(12時間)の間で設定可能です。

あとがき

セッションがずっと切れないのは便利な反面、セキュリティ面ではあまりよろしくない部分でもあるかと思います。マネジメントコンソールでの操作が終わったらすぐにサインアウトするのはもちろんですが、必要に応じて先述の仕組みを導入するなど、正しく仕様を理解した上で対策することが肝要、と兄が言っていました。

それではまた、ごきげんよう。

AWS Lambda に割り当てる IAM ポリシー

$
0
0

はじめに

こんにちは、技術一課の山中です。
冬は好きではないですが、夏は嫌いです。秋と春は大好きです。

さて、 AWS Lambda に割り当てる IAM ポリシーですが、みなさんどのようにしていますでしょうか?
まさか、「とりあえず全部 AdministratorAccess でええやん」でえいやってやっていませんか?
個人の検証アカウントでしたら百歩譲ってそれでよいかもしれませんが、できれば AWS のベストプラクティス に従い、最小権限を付与しましょう。

どのポリシーをつけるか

Lambda 関数を作成する場合、関数内で利用する API に対して必要なポリシーのみを割り当てていく、というのが基本のスタイルです。
例えば、関数内で describe_instances を利用して EC2 インスタンスの情報を取得する場合、以下のようなポリシーを付与します。

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

もし、 Action に記載する内容がわからないようであれば、 IAM ポリシーの作成画面でビジュアルエディタを利用するといいとおもいます。

また、 AWS Lambda では CloudWatch Logs にログを出力するために以下ポリシーが必要となります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ]
        }
    ]
}

よって、 AWS Lambda でインスタンスの情報を取得したい (describe_instances を利用したい) ような場合は、以下ポリシーを割り当てるだけで十分です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ]
        }
    ]
}

おわりに

今まで漠然と FullAccess を付けていた方もいらしたのではないでしょうか?
もしかしたら、本番環境の AWS Lambda が AdministratorAccess で動いているケースもあるかもしれません。
上記のことを念頭に置き、できるだけ無駄な権限は与えないようにしましょう。

【AWS Client VPN】AWS 公式の接続クライアントソフトがリリースされたので触ってみた

$
0
0

こんにちワン、技術2課の駒井です。
先日、昨年4月に映像化されていた ULTRAMAN をやっとこさ見たんですが、
スペシウム光線を放つシーンででちょっと滾っちゃいましたね。シュワッチ\(●皿● )>

今回は、先日公開された AWS 公式の Client VPN の
デスクトップクライアントソフト(Mac版)を使ってみようと思います!
New Desktop Client for AWS Client VPN

Client VPN については既に説明されているブログがあるので割愛します。
いままでは接続に OpenVPN のクライアントソフトや Tunnelblick というソフトを利用していましたが、
今回公開された AWS 公式のソフトウェアクライアントによって、
Client VPN の接続ができるようになりました!ついに公式です…!

検証環境について

環境は、前回公開したこちらのブログを利用していきますので
環境構築については、上記ブログを参考に作成ください。
macOS: Mojave 10.14.6
AWS VPN Client: Version 1.0.0

AWS VPN Client のダウンロードページ

AWS VPN のよくある質問 よりダウンロードページへ誘導がありました。

Q: AWS Client VPN のソフトウェアクライアントはどこからダウンロードできますか?
A: AWS Client VPN 製品ページからカスタマイズせずに汎用クライアントをダウンロードできます。IT 管理者は、自分のシステム内でダウンロードをホストするように選択できます。

上記ページよりダウンロードが可能です。
また、リリースノートは以下です。
Release Notes for the AWS-Provided Client

ダウンロード/インストールしてみた

パッケージのダウンロード

先ほど上記で案内したページより Mac 版のクライアントをダウンロードします
AWS_Client_VPN.pkg というファイル名でダウンロードされました。

パッケージのインストール

サクサクとインストールを進めていきましょう
特に解説するところはないのですが、私の端末が英語の設定になっていますので、
イングリッシュイングリッシュなスクリーンショットが続きます。
問題がなければあぐりーしましょう。
以上でインストール完了です。Spotlight にはこんな感じで出てきます。

起動/実際に接続してみた

起動しました。
まずは File > Manage Profiles からプロファイルを設定します。
適当なプロファイル名で、.ovpn ファイルを選択します。
.ovpn ファイルの証明書の記載の仕方についてですが、
私の環境ですと、絶対パスでの指定だと下記のようにエラーで接続ができませんでした。。
※暫定対処として前回のブログと同様に設定ファイルに直接証明書/鍵情報を記載しました。
(前回はスマートフォンでの運用だったので直接の記載を行いましたが、本来は参照の形が好ましいかと思います。)
設定ファイルに直接、証明書/鍵情報を記載した場合はエラーが出ませんでした。
エラーが出ず、接続できると、Connection Detail にて接続の状態を見ることができます。
今まで、Mac でのクライアント接続には Tunnelblick を利用しての接続ができました。
Tunnelblick ですと、接続時にログが可視化されたのですが、今回の公式クライアントだと、
接続時の Connection Detail だと流れているデータ量程度しか見れないのがちょっぴり寂しいですね。

接続後、前回作ったプライベートの Apache にも無事接続確認ができたので問題なく Client VPN が利用できていると言えるでしょう。

まとめ

今回は新しく公式からリリースされた Client VPN での接続試してみました。
公式で接続ソフトウェアが出たことで、接続に際して AWS サポートへ問い合わせることもできそうです。
また、AWS の機能を使う上で、開発元が AWS のソフトウェアを利用できると統一感が出ますね!
サードパーティ製のソフトウェアを利用せずに済むので、
Open VPN クライアントが宗教上インストールできない!っていう方はぜひお試しください(?)
ではまた次のブログでお会いしましょう!Seeyanara〜

Python の http.server を使って簡単にWebサーバーを立てる

$
0
0

こんにちは、技術1課の加藤です。
最近、AWSの機能をデモするためにフロントエンドをちょこちょこ書いています。

そんな中で、ちょろっとWebサーバーを立ててアクセスしたいなーと思った時に便利なTipsです。

http.server モジュールを使う (Python 3系)

Python 環境を用意されている方は、 http.server モジュールを利用することでWebサーバーを立てることができます。

$ python -V
Python 3.x.x
$ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

これでコマンドを実行したディレクトリをドキュメントルートにしたWebサーバーが立ち上がります。
デフォルトのポートが 8000 になっているため、 http://127.0.0.1:8000/http://localhost:8000 でローカルのWebサーバーにアクセスすることができます。

SimpleHTTPServer モジュールを使う (Python 2系)

Python の 2 系では、http.server ではなく SimpleHTTPServer というモジュールを使います。

$ python -V
Python 2.x.x
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

こちらも同じく、コマンドを実行したディレクトリがドキュメントルートとなってWebサーバーが立ち上がります。
(※ Python 2系は 2020年1月1日をもってサポートが終了しています。使う際は自己責任でお願いします)

おまけ1. ポートを指定したい場合

コマンドの後にポート番号をつけることで、ポート指定してサーバーを立ち上げることができます。

$ python -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

おまけ2. Python コマンドの m オプション

Python コマンドの mオプションはモジュールをスクリプトとして実行するコマンドです。
Python 3系を使っている人の中には、仮想環境を作成する venv を利用する際に

$ python -m venv <virtualenv_name>

というコマンドを打ったことがある方、いるんじゃないでしょうか。あの mオプションはこれ。venv モジュールをスクリプトとして動かしています。

これを使うと、 jq (jsonをパースするコマンドラインツール) のようなことが Python のみでできたりします。

$ echo '{"key": "value"}' | python -m json.tool
{
    "key": "value"
}

他にも便利な使い方があるかもしれないので、探してみても面白いかもしれません。

Lambda ランタイムの Python 2系が廃止になる件について今更まとめてみる

$
0
0

こんにちは、技術1課の加藤です。

Python 2.7 が 2020年1月1日をもってサポート終了となりました。
Sunsetting Python 2 | Python.org

これに伴い Lambda のランタイムからも Python 2系が使えなくなるのでは…!? とザワザワしていたわけですが、どうやら継続的なサポートが行われるようです。
Continued support for Python 2.7 on AWS Lambda

上記は1月の発表なので少々今更感が否めないですが、きちんとランタイムのサポートについて把握していなかったのもあり改めて調べてみました。

ついでに今後の Lambda の Python 2系のサポートについて、まとめてみようと思います。

Lambda ランタイムサポートの廃止

まずは通常のランタイムサポートの廃止について。
公式ドキュメントのランタイムサポートポリシーには以下のように書かれています。

廃止は、2 つのフェーズで行われます。最初のフェーズでは、廃止予定のランタイムを使用する関数を作成することはできません。少なくとも 30 日間は、廃止予定のランタイムを使用する既存の関数を引き続き更新することができます。この期間が過ぎると、関数の作成と更新のいずれも、完全に無効になります。ただし、この関数は呼び出しイベントの処理に引き続き使用することができます。

簡単にまとめると、以下の図のようになります。

段階的に終了させていくことで、ランタイムを完全に廃止するまでに対策を取れるようにしているわけですね。

既存関数の実行については更新できなくなってからもしばらくはサポートするようですが、いつ実行が不可能になるかは記載がありません。
なるべく早急に対応する必要がありそうです。

なおランタイムの廃止に伴って影響を受ける方には、メール通知が送られます。定期的に確認するようにしておきましょう。

Python 2.7 の継続的サポートについて

では Python 2.7 の場合はどうなのか。前述のブログを確認します。

結論から言うと 2020年12月31日まで は、クリティカルなセキュリティパッチについては継続的に提供するようです。廃止予定もまだ出ていませんので、関数の新規作成・更新・利用について特別な設定の必要なく現在も行うことが可能です。

これは Python の2系と3系の互換性が低く、置き換えに時間がかかることを考慮しての対応と明記されています。

We also recognize that these differences can make migration challenging. To allow you additional time to prepare, [AWS Lambda](https://aws.amazon.com/lambda) will continue to provide critical security patches for the Python 2.7 runtime until at least December 31, 2020.

またサポート対象はインタープリタと標準ライブラリまでであり、サードパーティ製のパッケージについてはサポートしないようですね。

Lambda’s scope of support includes the Python interpreter and standard library, but does not extend to third-party packages.

Python 2.7 の廃止予定日は?

現在(2020年2月12日)のところランタイムサポートポリシーのページでは廃止予定日について明記されていません。

とはいえ前述の通り、12月31日までの継続サポートも、以降までの猶予期間として設定されているものですし、いつかは廃止になるだろうことは予想されます。
ですので、なるべく早いうちに対象の Lambda を Python 3系にアップデートしてあげる必要は (当然ですが) あります。

Python 2系から 3系に移行するには

継続サポートのブログにて移行用のガイドやツールについて記載がありましたのでこちらでも掲載しておきます。
なかなか大変な対応ではありますが、みなさん早め早めに3系への移行を進めておきましょう。

S3にアップロードされたファイル名をLambdaを使ってCloudwatch logsに出力してみた

$
0
0

休日にAmazon Primeのドラマ視聴にハマって抜け出せなくなってしまったCI部5課の山﨑です。

DVAの試験勉強の時にあまり触れていなかったLambdaの勉強を始めました。基本的な内容だと思いますが、一つ一つ整理しながらまとめていきたいと思います。

Lambdaについて

AWS Lambda はサーバーをプロビジョニングしたり管理する必要なくコードを実行できるコンピューティングサービスです。利用者はコードの実行環境について考える必要がないため、コード作成に時間を集中させることが可能です。以下、よく比較対象とされるEC2とLambdaの比較表です。

 項目 EC2 Lambda
サーバー管理 必要 不要
実行環境の整備 必要 不要
負荷分散 ELBとAuto Scallingを別途使用するため工数がかかる 自動スケーリング
料金 コンピューティングキャパシティーに対して時間あたりまたは秒あたりで課金
※使用していない時間も料金が発生してしまう 
関数に対するリクエストの数とコードの実行時間に基づいて課金 
処理能力 インスタンスタイプの変更により柔軟に対応可 割当メモリ量に比例
※メモリ量には制限あり

いざ、実践

構築フェーズは大きく分けて下記の3つです。

  • IAMロールの作成
  • S3の作成
  • Lambda関数の作成

IAMロールの作成

Lambdaに割り当てるIAMロールを作成します。今回Lambdaには「Cloudwatch」と「S3」へのアクセス許可を付与する必要があります。

IAMロールの作成画面でLambdaを選択

作成するプログラムによって付与するポリシーは異なるとは思いますが、今回は「AmazonS3FullAccess」「AWSLambdaBasicExecutionRole」を付与し、ロール名は「role-lambda」とします

S3の作成

ファイルをアップロードするS3を作成します

バケット名は「lambda-relation-with-s3」とし、その他の設定は特に変更せずにバケットを作成します。

Lambda関数の作成

ここでようやくLambda関数の作成に取り掛かります。

今回は設計図の使用(Blue print)を選択し、s3-get-object-pythonを選択します

下記のように設定して関数を作成します。

  • Function name:関数名を任意で入力
  • Execution Role:先程作成したIAMロール(role-lambda)を設定
  • バケット:先程作成したS3バケットを指定
  • イベントタイプ:今回は「すべてのオブジェクト作成イベント」を設定

ここから関数の編集画面でLambda関数のコードを書いていきます。

以下、今回のLambda関数のコード(Python)です。

def lambda_handler(event, context):
    key = event['Records'][0]['s3']['object']['key']
    print(key) #print関数の標準出力がCloudwatch Logsに出力される
    return(key)

lambda_handlerには「event」と「context」という2つの引数を必ず渡します

event引数について

event引数はイベントから引き渡されるJSON形式のデータです。今回はS3のCreateイベントが発生した際のデータがevent引数として関数に渡されます。実際に渡されるデータは下記のような形式になっています。

{
  "Records":[
    {
      "eventVersion":"2.0",
      "eventSource":"aws:s3",
      "awsRegion":"us-west-2",
      "eventTime":"1970-01-01T00:00:00.000Z",
      "eventName":"ObjectCreated:Put",
      "userIdentity":{
        "principalId":"AIDAJDPLRKLG7UEXAMPLE"
      },
      "requestParameters":{
        "sourceIPAddress":"127.0.0.1"
      },
      "responseElements":{
        "x-amz-request-id":"C3D13FE58DE4C810",
        "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
      },
      "s3":{
        "s3SchemaVersion":"1.0",
        "configurationId":"testConfigRule",
        "bucket":{
          "name":"sourcebucket",
          "ownerIdentity":{
            "principalId":"A3NL1KOZZKExample"
          },
          "arn":"arn:aws:s3:::sourcebucket"
        },
        "object":{
          "key":"HappyFace.jpg",
          "size":1024,
          "eTag":"d41d8cd98f00b204e9800998ecf8427e",
          "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko"
        }
      }
    }
  ]
}

参照ドキュメント:チュートリアル: Amazon S3 で AWS Lambda を使用する

関数によって受け取られたJSONデータはparseされてPythonのオブジェクトに変換されています。そのため、例えばJSONデータ中のkeyの値を取得したい場合は下記のように記述します。

event['Records'][0]['s3']['object']['key']

context引数について

context引数にはLambda関数名や割当メモリや実行可能な残時間など、Lambdaの実行環境の情報が含まれます。

実装したコードをテスト

Lambdaでは実装したコードを簡単にテストすることができます。Lambda関数の編集画面の上部のテストイベントの設定を選択し、必要なテスト情報を入力します。

設定後にテストのボタンをクリックするとテストが実行されます。

テストが問題なく実行されたので、実際にS3にファイルをアップロードしてみます。が、その前にやっておく作業があります。

S3のプロパティからイベントをクリックして通知設定を行います。

この通知設定をしておかないと、S3でイベントが発生したとしてもそのイベント情報をLambda関数にevent引数として引き渡すことができないため処理が正しく行われません。

そして、Lambda関数の編集画面からS3のイベントトリガーを有効にします。

ここまで設定ができたら変更内容を保存して、いよいよS3にファイルをアップロードします。

アップロードができたらCloudwatch Logsにファイル名が出力されているか確認してみます

無事に出力されていることが確認できました! まだまだ基本的な部分にしか触れることができていませんが、これからLambdaの学習をより進めていきたいと思います!!


Developers Summit 2020にて「AWS障害で考えさせられた、アプリケーションインフラ構成の注意ポイント」ということで発表させていただきました。

$
0
0

こんにちは、技術4課の城です。
本日、翔泳社様が開催されているDevelopers Summit 2020というイベントに弊社佐藤とともに登壇してきました。
https://event.shoeisha.jp/devsumi/20200213/session/2415/

昨年発生したAWS東京リージョンでの障害について、及び、障害に備えてアプリケーションインフラ構成をどうするか、という内容でお話しさせていただきました。
発表資料については下記リンク先となります。

初めての登壇ではありましたが、非常によい経験をさせていただきました。
また、他の登壇者様の発表についても学ぶべき点が多かったです。
Developers Summitは毎年開催されているようですので、是非参加してみてはいかがでしょうか。

ではでは。

【小ネタ】リージョンごとに利用できるAWSサービス数について

$
0
0

こんにちは、技術4課の福島です。
今回は、小ネタになります。

リージョンごとに利用できるAWSサービスは、
違うかと思いますが、そこで気になりました。

どこのリージョンが一番、色んなAWSサービスを利用できるのかと。

参考)リージョン表
https://aws.amazon.com/jp/about-aws/global-infrastructure/regional-product-services/

結果

いきなりですが、調査した結果は、以下の通りした。
1位は、北バージニアリージョンで、私たちが住んでいる日本は、5位でした!

また現在は、194個のAWSサービスが存在しております。

順位 リージョン名 利用できるAWSサービス数
1位 北バージニア 190
2位 オレゴン 184
3位 アイルランド 177
4位 シドニー 165
5位 オハイオ 161
5位 東京 161
7位 フランクフルト 159
8位 シンガポール 155
9位 ロンドン 145
10位 ソウル 141
11位 ムンバイ 131
12位 北カリフォルニア 125
12位 モントリオール 125
14位 パリ 114
15位 サンパウロ 113
16位 ストックホルム 111
17位 AWS GovCloud (米国西部) 95
18位 香港 87
19位 バーレーン 77
20位 AWS GovCloud (米国東部) 73
21位 寧夏 68
22位 北京 64
23位 大阪 37

 

さらに調査

さらに、以下の2つが気になったので、調査してみました。

①1位の北バージニアリージョンでも対応していないAWSサービスは、何なのか。
②私たちが住んでいる日本リージョンで対応していないAWSサービスは、何なのか。

①1位の北バージニアリージョンでも対応していないAWSサービスは、何なのか。

結果は、以下の4個のサービスでした。
「Application Discovery Service」が対応していなかったのは、ちょっと驚きでした。

AWS Application Discovery Service
AWS Device Farm
AWS Ground Station
AWS Migration Hub

②私たちが住んでいる日本リージョンで対応していないAWSサービスは、何なのか。

結果は、以下の33個のサービスでした。
ほとんど知らないサービスでした…

Alexa for Business
Amazon Augmented AI (A2I)
Amazon Cloud Directory
Amazon CodeGuru (プレビュー)
Amazon Comprehend
Amazon Comprehend Medical
Amazon DeepLens
Amazon Elastic Compute Cloud (EC2) C5n インスタンス
Amazon Elastic Compute Cloud (EC2) Inf1 インスタンス
Amazon Fraud Detector
Amazon Kendra
Amazon Lex
Amazon Machine Learning
Amazon Macie
Amazon Managed Blockchain
Amazon Mobile Analytics
Amazon Pinpoint
Amazon Rekognition カスタムラベル
Amazon Simple Email Service (SES)
Amazon Textract
Amazon Transcribe Medical
Amazon WorkLink
Amazon WorkMail
Amazon WorkSpaces Application Manager
AWS App Mesh
AWS Compute Optimizer
AWS DeepComposer
AWS DeepRacer
AWS Device Farm
AWS Ground Station
AWS IoT SiteWise (プレビュー)
AWS Migration Hub
AWS Single Sign-On

まとめ

現時点で、194個のサービスがあり、
全てのサービスをキャッチアップするのは、大変ですが、
少しずつ、色んなサービスのキャッチアップを行い、
お客様に最適なAWSサービスをご利用いただけるよう精進しようと改めて、感じました。

以上です。

Gremlinを使ってCPU負荷を注入する

$
0
0

Gremlinというカオスエンジニアリングサービスを使ってみました。

Gremlinの概要

公式ドキュメントの説明

Turn failure into resilience. Gremlin provides you with the framework to safely, securely, and simply simulate real outages with an ever-growing library of attacks. Using Chaos Engineering to improve system resilience, Gremlin’s “Failure as a Service” makes it easy to find weaknesses in your system before they cause problems for your customers.

We offer several categories of attacks to inject faults into your system:

Google翻訳

障害を回復力に変えます。 Gremlinは、増え続ける攻撃のライブラリを使用して、実際の停止を安全かつ安全に簡単にシミュレートするフレームワークを提供します。 Chaos Engineeringを使用してシステムの復元力を向上させるGremlinの「サービスとしての失敗」は、顧客に問題を引き起こす前にシステムの弱点を簡単に見つけることを可能にします。

システムに障害を注入するために、いくつかのカテゴリの攻撃を提供しています。

今回の構成

Gremlinのプラン

Gremlinには、FreeプランとProプランがあります。
Freeプランだと、対象ホスト数は5台まで、できる攻撃も3種類(Shutdown、CPU、Blackhole)と機能が限定されますが、今回はFreeプランで試してみました。

https://www.gremlin.com/pricing/

Gremlinのアカウントを準備

GremlinはSaaSサービスなので、アカウントを作成する必要があります。

メールアドレス、名前の登録

サインアップページにアクセスし、メールアドレス名前を入力します。

パスワード、Role、会社名、チーム名の設定

Gremlin管理画面

アカウント作成に成功すると、管理画面に遷移します。

Team ID、Secret Keyの確認

管理対象ホストでGremlinデーモンを起動する際にTeam IDとSecret Keyが必要になります。
Gremlinの管理画面で確認をしましょう。

まず、アカウント名のところをクリックします。

次にCompany Settingsをクリックします。

次にTeams > 作成したTeam名 > Configuration の順にクリックしていきます。

Team IDが確認できます。
Secret KeyはResetボタンをクリックして作成する必要があります。

ホストへGremlin Daemonのインストール

今回はEC2インスタンス(Amazon Linux 2)にGremlin Daemonをインストールしました。

参考にしたページ

iproute-tcのインストール

$ sudo yum install -y iproute-tc

Gremlinリポジトリのインストール

$ sudo curl https://rpm.gremlin.com/gremlin.repo -o /etc/yum.repos.d/gremlin.repo

Gremlin Daemonのインストール

$ sudo yum install -y gremlin gremlind

Gremlin Daemonの起動

ここでTeam IDとSecret Keyが必要になります。

$ sudo gremlin init
Please input your Team ID:
ダッシュボードで確認した自分のTeam IDを入力します。
Please input your Team Secret:
ダッシュボードで確認した自分のSecret Keyを入力します。
Metadata set for [ gremlin-client-version: 2.12.25 ]
Metadata set for [ os-type: Unknown ]
AWS metadata may be present
Metadata set for [ instance-id: i-0695731fe62dc9add ]
Metadata set for [ local-hostname: ip-10-200-10-27.ap-northeast-1.compute.internal ]
Metadata set for [ local-ip: 10.200.10.27 ]
Metadata set for [ public-hostname: ec2-13-231-133-222.ap-northeast-1.compute.amazonaws.com ]
Metadata set for [ public-ip: 13.231.133.222 ]
Metadata set for [ cloud: AWS ]
Metadata set for [ image-id: ami-0af1df87db7b650f4 ]
Metadata set for [ instance-type: t2.micro ]
Metadata set for [ region: ap-northeast-1 ]
Metadata set for [ zone: ap-northeast-1a ]
Azure metadata may be present
Using xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx for Team Id
Using 10.200.10.27 for Gremlin identifier

ホストの登録を確認

管理画面 > Clients を見ると、EC2インスタンスがClientsとして登録されているのがわかります。
なお、初期状態では2つのデモ用ホストも登録されていますが、初めてのAttackが完了すると、これらは自動的に削除されるようです。

Attackの作成

管理画面 > Attacks > New Attack をクリックします。

Choose Hosts target

攻撃対象にするEC2インスタンスを選択します。

Choose a Gremlin

どのような攻撃をするのか定義します。
Freeプランの場合は、鍵マークがある項目は選択できません。

今回は下記のように、「CPU:80%が300秒続く攻撃」を定義してみました。

  • Resource > CPU
  • Length(攻撃秒数): 300
  • CPU Capacity(CPU Coreあたりでアクティブにするパーセンテージ): 80%
  • Cores(いくつのCoreをターゲットにするか): 1

Coresは、数字だけでなく、「All Cores」 という指定も可能です。
ただ、今回の対象ホストは、t2.microでコアは1つだけなので、「1」でも「All Cores」でも結果は同じになるはずです。

Run the Attack

Attackのスケジューリングをします。
「Only Once」という、その場で1回だけ実行もありますが、今回は少し複雑なスケジュールを作成してみます。

  • 攻撃する曜日は、土曜日と日曜日
  • 1日あたりの攻撃回数は、20回
  • 攻撃する時間帯は、16時〜20時

Unleash Gremlin

Unleash Gremlinボタンを押すと、設定が確定されます。

Unleashは「解き放つ」という意味です。
Gremlinが解き放たれました!

Gremlinが暴れるのを観察

指定した時間帯のCloudWatchは、下記のようになりました。
CPU使用率がスパイクしているのがわかります。
t2.microなので、CPUクレジットがギリギリでした。

攻撃発生中にLinuxのtopコマンドを打ってみると、gremlinがCPU消費しているのがわかります。

top - 07:35:03 up  1:39,  0 users,  load average: 0.96, 0.29, 0.10
Tasks:  85 total,   1 running,  47 sleeping,   0 stopped,   0 zombie
%Cpu(s): 96.3 us,  0.7 sy,  0.0 ni,  3.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1006968 total,   485772 free,    86828 used,   434368 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   772604 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
  704 gremlin   20   0   26148   6928   6604 S 49.2  0.7   0:54.44 gremlin
  713 gremlin   20   0   26128   6988   6668 S 47.5  0.7   0:13.66 gremlin
    1 root      20   0  125488   5436   3984 S  0.0  0.5   0:01.46 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
    4 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 kworker/0:0H
    6 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 mm_percpu_wq
    7 root      20   0       0      0      0 S  0.0  0.0   0:00.15 ksoftirqd/0
    8 root      20   0       0      0      0 I  0.0  0.0   0:00.22 rcu_sched

管理画面で実行ログが見れます。

感想

Gremlinの導入は、想像よりも簡単でした。
管理画面も使いやすく、完成度が高いように感じます。
今回のケースだと単純にCPU使用率でしたが、Proプランにすれば、ネットワークのLatency等いろいろできて良さげです。

Amazon VPCフローログで集約間隔を1分に設定可能

$
0
0

こんにちは、技術1課の小倉です。
2020/2/5にアップデートがあり、Amazon VPCフローログで集約間隔を1分に設定できるようになりました。

Amazon VPC フローログで、集約間隔を 1 分に設定できるようになりました

今まではCloudWatch Logsなどに10分程度かかってから出力されていましたが、出力されるまでの時間が短縮しています。ですから、フローログによる通信調査や検知などが、よりリアルタイムに近い状況でできます。

VPC フローログ作成

2020/2/16現在、確認した限り、VPCフローログは設定変更をすることができません。CLIのオプションも確認しましたが、delete, create, describeしかありませんでした。

もし既存で設定済みで集約間隔を1分に変更したい場合はVPCフローログの追加/削除が必要です。ログが欠損しないようにまずは1分の設定を追加して、ログが重複して取得されたことを確認してから、既存の10分の設定を削除するのがよいと思います。

フローログはVPC単位とENI単位で作成できます。
VPC単位であればVPCに含まれるすべてのENIでフローログを取得し、ENI単位であれば設定したENIのみフローログを取得できます。

VPC単位 : VPC – 対象のVPCを選択 – アクション – フローログの作成
ENI単位 : EC2 – ネットワークインターフェース – 対象のENIを選択 – アクション – フローログの作成

フローログの作成画面にMaximum aggregation intervalという項目が増え、1分か10分を選べます。CloudWatchログへの送信の場合は送信先ロググループとIAMロール、S3バケットへの送信であればS3バケットの事前作成が必要です。

今回は既存の集約間隔が10分と同じ送信先に集約間隔が1分のVPCフローログを追加しました。

自分の端末から対象のVPCにあるEC2へSSHログインして、ログの出力を確認します。
約1分後に同じログが2つ表示されました。予想では1分後に集約間隔1分のログ、10分後に集約間隔10分のログが表示されると考えていたのですが、予想とは違う結果でした。

まとめ

VPCフローログの集約間隔の既存設定は10分になっていて、設定変更は不可です。
ですから、既存設定の集約間隔を10分から1分に変更するには1分の設定を追加し、ログの欠損などがあるかもしれませんので、様子を見てから10分の既存設定を削除することで変更できます。また、集約間隔を1分に変更しても追加料金はかかりません。

【Amazon Cognitoのセキュリティ】ログイン連続失敗時の「アカウントロック機能」について

$
0
0

「Amazon Cognito」とは

「Amazon Cognito」は、Webアプリケーションやモバイルアプリケーションの認証、許可、ユーザ管理をしてくれるサービスです。

アプリユーザは、Cognitoのユーザディレクトリである「ユーザプール」を通じて直接サインインしたり、サードパーティーのIDプロバイダー(IdP) を通じて連携してサインインすることもできます。

まとめると、Cognitoを使うことで下記のようなメリットがあります。

・モバイルアプリケーションやウェブアプリケーションにユーザのサインアップと認証機能を簡単に追加できる
・外部IDプロバイダーを介してユーザを認証することもできる
・AWS内のアプリケーションのバックエンドリソースにアクセスするための一時的な認証情報を付与できる

Cognitoが提供する基本的な機能については下記のブログエントリを参照ください。

Amazon Cognitoのい・ろ・は

Amazon Cognito User Pool / Identity Poolで事始め

Amazon CognitoとFacebookとの連携

Cognitoには「アカウントロック機能」はある?

Webアプリやモバイルアプリのセキュリティ要件として「アカウントロック(ロックアウト)機能」が必要な場合があります。

「アカウントロック」とは、銀行やECサイトなどのログインが必要なシステムで(悪意のある第三者の不正ログインを防ぐために)何度もログインに失敗すると一時的にログイン不能にされちゃうアレですね。

Cognitoを使ってユーザの認証機能を実装した場合、この「アカウントロック機能」は標準で提供されるのでしょうか?

AWSドキュメントを探してみてもそのような記載が見当たらなかったので、AWSサポートに問い合わせてみました。

Cognitoが提供するアカウントロック機能とその挙動

AWSサポートからの回答では「Cognitoには連続して認証が失敗するとアカウントをロックする機能がある」ということです。

内容を要約すると以下になります。

・Cognitoユーザプールでは、ユーザから連続した認証の失敗が発生すると、そのユーザのリクエストを制限してアカウントをロックする挙動がある
 
・アカウントがロックされている場合には「NotAuthorizedException」が発生し、メッセージとして “Password attempts exceeded” が返される
 
・ロックされる具体的な条件や期間については内部仕様のため公開していない
 
・サインインに失敗した回数に応じて指数関数的に期間が増加するような仕組みになっている

これからCognitoを使ってユーザ認証の仕組みやセキュリティ対策を検討される方のご参考になれば幸いです。

Amazon Cognitoの高度なセキュリティ(アドバンスドセキュリティ)については下記のエントリもご参考ください。

【Amazon Cognito】ユーザープールのアドバンスドセキュリティ機能(ASF:Advanced Security Feature)について

Viewing all 1210 articles
Browse latest View live


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