Upgrade to Pro — share decks privately, control downloads, hide ads and more …

180405_AWS_Deep_Night_in_Fukuoka_part2.pdf

tutida
April 09, 2018

 180405_AWS_Deep_Night_in_Fukuoka_part2.pdf

tutida

April 09, 2018
Tweet

More Decks by tutida

Other Decks in Technology

Transcript

  1. AWS Deep Night in 福岡 Part.2 2018 / 04 /

    05 Fusic Co.,Ltd. Tomoyuki Uchida FusicにおけるAWSの管理事情 ~「つらみ」とそれに対する「対応」~
  2. AWS Deep Night in 福岡 Part.2 • 内田 大順(Uchida Tomoyuki)

    • Github:https://github.com/tutida • Qiita :http://qiita.com/tutida • Fusic Co.,Ltd. • https://fusic.co.jp/ • エンジニア • AWSのインフラ設計・構築・移行 • 認定:ソリューション アーキテクト プロフェッショナル • 好きなサービス:IAM, CloudFormation • 業務系の受託開発(PHP, Ruby) • 最近 • ペルソナ5のアニメがすごく楽しみ • スライド 70枚になっちゃったので頑張ります 2 自己紹介
  3. AWS Deep Night in 福岡 Part.2 • 会社紹介 • 株式会社

    Fusic (フュージック) • 設立年月日:2003年10月10日 • 従業員数:43名 • 事業内容: • テクノロジーコンサルティング • ソフトウェア開発(Webシステム・スマートフォンアプリ) • クラウドインフラ構築 • AI(人工知能)コンサルティング • AWS アドバンスト コンサルティングパートナー • AWS パブリックセクタ―(公共部門)パートナー 4 Fusic と AWS
  4. AWS Deep Night in 福岡 Part.2 • 2011年~ 自社サービスの基盤でAWSを採用 •

    ここで得たノウハウを受託案件に展開していく 5 Fusic と AWS
  5. AWS Deep Night in 福岡 Part.2 • 2011年~ 自社サービスの基盤でAWSを採用 •

    ここで得たノウハウを受託案件に展開していく • 2018年 4月 • AWSアドバンスド コンサルティングパートナー • エンジニア数 34名 のうち、11名がAWSの認定資格保有 • (内 プロフェッショナル 5名 6 Fusic と AWS
  6. AWS Deep Night in 福岡 Part.2 • 2011年~ 自社サービスの基盤でAWSを採用 •

    ここで得たノウハウを受託案件に展開していく • 2018年 4月 • AWSアドバンスド コンサルティングパートナー • エンジニア数 34名 のうち、11名がAWSの認定資格保有 • (内 プロフェッショナル 5名 AWSいっぱい使ってます 7 Fusic と AWS
  7. AWS Deep Night in 福岡 Part.2 • AWSいっぱい使ってます • いつの日か大小合わせるとAWSアカウントの数が100を

    超えていた • 規模が増えていくと、案件内容とは別で、 社内の管理面で「つらみ」が出てきた… 10 Fusic と AWS
  8. AWS Deep Night in 福岡 Part.2 ※ ご注意 ※ この先、多少愚痴っぽく言うこともありますが、

    ベースはAWS大好きです。 好きだからこそ気になるとこに気づいちゃう恋バナ的な テンションで聞いていただけると助かります。 12 「つらみ」とそれに対する「対応」
  9. AWS Deep Night in 福岡 Part.2 • 面倒くさい … 24

    AWSアカウント発行時の面倒さ
  10. AWS Deep Night in 福岡 Part.2 • 面倒くさい … •

    「連絡先情報」:社内限定Wikiから都度コピペ • 生まれるコピペミス、空白含む含まない 25 AWSアカウント発行時の面倒さ
  11. AWS Deep Night in 福岡 Part.2 • 面倒くさい … •

    「連絡先情報」:社内限定Wikiから都度コピペ • 生まれるコピペミス、空白含む含まない • 「クレカ情報」:都度 経理から受け取り情報入力 • 経理が席を外してると作業できない • 入力ミス発生の可能性も大(俺覚えてるし勢 26 AWSアカウント発行時の面倒さ
  12. AWS Deep Night in 福岡 Part.2 • 面倒くさい … •

    「連絡先情報」:社内限定Wikiから都度コピペ • 生まれるコピペミス、空白含む含まない • 「クレカ情報」:都度 経理から受け取り情報入力 • 経理が席を外してると作業できない • 入力ミス発生の可能性も大(俺覚えてるし勢 • 「電話認証」:チャット + 社内に響き渡る声 • 「AWSから電話きまーす!とらないでくださーい!」 • 誰か電話取っちゃうとコードを伝えて入力してもらう 27 AWSアカウント発行時の面倒さ
  13. AWS Deep Night in 福岡 Part.2 • 2017年 2月 「AWS

    Organizations」が一般公開 • 一つの親アカウントのもとにAWSアカウントを「組織」とし て管理が可能 • 複数の AWS アカウントに対するポリシーフレームワーク • AWS のサービスの APIレベルの制御 • 従来の一括請求機能と統合 • アカウントの作成および管理API 30 AWSアカウント発行時の面倒さ
  14. AWS Deep Night in 福岡 Part.2 • 2017年 2月 「AWS

    Organizations」が一般公開 • 一つの親アカウントのもとにAWSアカウントを「組織」とし て管理が可能 • 複数の AWS アカウントに対するポリシーフレームワーク • AWS のサービスの APIレベルの制御 • 従来の一括請求機能と統合 • アカウントの作成および管理API 31 AWSアカウント発行時の面倒さ キタコレ!
  15. AWS Deep Night in 福岡 Part.2 • さらに幸せなことに • SDKを利用して、プログラムでも書けます

    • アカウント名、メールアドレスに規則性があれば、 プログラムでボタン一個で作成可能に 37 AWSアカウント発行時の面倒さ # AWS SDK for Ruby Aws.config.update(access_key_id: xxxxxxx, secret_access_key: xxxxxxxx) org = Aws::Organizations::Client.new(region: 'us-east-1') org.create_account(account_name: aws_account_name, email: email)
  16. AWS Deep Night in 福岡 Part.2 • Fusicでの実際の運用方法 • 1.案件ごとの担当者が社内AWSアカウント管理者に連絡

    • 2.AWS Organizations で作成 • ※ 単独アカウントの場合、従来の方法で作成 • 3.担当者がパスワードリセット、MFAの設定を行う 38 AWSアカウント発行時の面倒さ
  17. AWS Deep Night in 福岡 Part.2 • Fusicでの実際の運用方法 • 1.案件ごとの担当者が社内AWSアカウント管理者に連絡

    • 2.AWS Organizations で作成 • ※ 単独アカウントの場合、従来の方法で作成 • 3.担当者がパスワードリセット、MFAの設定を行う 39 AWSアカウント発行時の面倒さ アカウント発行を担当者ではなく、社内管理者に委任 社内管理者がAWSアカウントを把握しやすくなる 肝心のアカウント発行の手間も少ないため、負担はそこまで増えない 担当者ごとの発行によるブレの解消につながる 「AWSから電話きまーす!」がほぼなくなる
  18. AWS Deep Night in 福岡 Part.2 • Fusicでのログイン情報の管理 • コンソールへのログインに用いるrootアカウント、IAMアカウ

    ントにはMFAの設定を絶対としている • 1.アカウント発行時にrootアカウントにMFAを設定 • MFA設定用のQRコードを社内の「しかるべき場所」に保管 • 2.アカウントを利用する社員ごとにIAMを作成 • IAMに用いるパスワード、MFA情報は個人で管理 42 AWSへのログイン情報の管理
  19. AWS Deep Night in 福岡 Part.2 44 AWSへのログイン情報の管理 • 正直、毎回MFA入力するのは面倒

    • スマホのMFA管理ツールのアカウント量が半端ない • 「しかるべき場所」に保管されてないことも…orz • 結局、人に依存している • 緊急時に誰もコンソールにログインできなくなる危険性
  20. AWS Deep Night in 福岡 Part.2 45 AWSへのログイン情報の管理 • 正直、毎回MFA入力するのは面倒

    • スマホのMFA管理ツールのアカウント量が半端ない • 「しかるべき場所」に保管されてないことも…orz • 結局、人に依存している • 緊急時に誰もコンソールにログインできなくなる危険性 • 利用者ごとにIAM作るのつらい • AWSアカウントに加えてIAMアカウントの管理も必要に • IDプロバイダーを利用したフェデレーションログインは? • FusicではLDAPもActiveDirectoryもない…
  21. AWS Deep Night in 福岡 Part.2 48 AWSへのログイン情報の管理 • IAMのアクセスキーとシークレットキーを利用し、一

    時的なクレデンシャルを生成しコンソールへのログイ ンURLがプログラムで生成可能 • リンクを押せば、ログインできる機構が作成可能 • 結局、IAMユーザが増えてない? • 単独アカウント、Organizationsの親アカウントには1つのIAM があればよい • Organizationsに属するファミリーアカウントには、親アカウン トのIAMを信頼する IAM Assume Role が存在し、これを利用
  22. AWS Deep Night in 福岡 Part.2 49 AWSへのログイン情報の管理 AWS cloud

    単独アカウント・Organizationsの親アカウントの場合 ボタン パスワード 無しの IAMを作成 IAM “hoge” ① IAM “hoge” のアクセスキー シークレットキーを利用して フェデレーション用のトークンを要求 ② 一時的なトークンを返却 ③ トークンを利用しログインURLを要求 ④ 有効期限付きのURLを返却 リンクでログイン可能
  23. AWS Deep Night in 福岡 Part.2 50 AWSへのログイン情報の管理 単独アカウント・Organizationsの親アカウントの場合 #

    AWS SDK for Ruby sts = Aws::STS::Client.new() session = sts.get_federation_token({ duration_seconds: 3600, name: "UserName", policy: "Policy", }) issuer_url = "https://mysignin.internal.mycompany.com/" console_url = "https://console.aws.amazon.com/" signin_url = "https://signin.aws.amazon.com/federation" session_json = { :sessionId => session.credentials[:access_key_id], :sessionKey => session.credentials[:secret_access_key], :sessionToken => session.credentials[:session_token] }.to_json get_signin_token_url = signin_url + "?Action=getSigninToken" + "&SessionType=json&Session=" + CGI.escape(session_json) returned_content = URI.parse(get_signin_token_url).read signin_token = JSON.parse(returned_content)['SigninToken'] signin_token_param = "&SigninToken=" + CGI.escape(signin_token) issuer_param = "&Issuer=" + CGI.escape(issuer_url) destination_param = "&Destination=" + CGI.escape(console_url) login_url = signin_url + "?Action=login" + signin_token_param + issuer_param + destination_param
  24. AWS Deep Night in 福岡 Part.2 51 AWSへのログイン情報の管理 単独アカウント・Organizationsの親アカウントの場合 #

    AWS SDK for Ruby sts = Aws::STS::Client.new() session = sts.get_federation_token({ duration_seconds: 3600, name: "UserName", policy: "Policy", }) issuer_url = "https://mysignin.internal.mycompany.com/" console_url = "https://console.aws.amazon.com/" signin_url = "https://signin.aws.amazon.com/federation" session_json = { :sessionId => session.credentials[:access_key_id], :sessionKey => session.credentials[:secret_access_key], :sessionToken => session.credentials[:session_token] }.to_json get_signin_token_url = signin_url + "?Action=getSigninToken" + "&SessionType=json&Session=" + CGI.escape(session_json) returned_content = URI.parse(get_signin_token_url).read signin_token = JSON.parse(returned_content)['SigninToken'] signin_token_param = "&SigninToken=" + CGI.escape(signin_token) issuer_param = "&Issuer=" + CGI.escape(issuer_url) destination_param = "&Destination=" + CGI.escape(console_url) login_url = signin_url + "?Action=login" + signin_token_param + issuer_param + destination_param トークン発行時にユーザ名・権限も設定可能 IAMにログイン用のパスワード・MFAの設定が必要ない ためセキュリティ的にもうれしい
  25. AWS Deep Night in 福岡 Part.2 52 AWSへのログイン情報の管理 親アカウント Organizationsに属するファミリーアカウントの場合

    パスワード 無しの IAMを作成 IAM “hoge” ファミリーアカウント 親アカウントを 信頼するRoleが 自動で作成され ている ① IAM “hoge” のアクセスキー シークレットキーを利用して… ④ 有効期限付きのURLを返却 リンクでログイン可能
  26. AWS Deep Night in 福岡 Part.2 53 AWSへのログイン情報の管理 単独アカウント・Organizationsの親アカウントの場合 #

    AWS SDK for Ruby assume_credential = Aws::AssumeRoleCredentials.new( client: Aws::STS::Client.new, role_arn: "arn:aws:iam::#{family_account_id}:role/OrganizationAccountAccessRole", role_session_name: "SessinName", policy: "Policy", ) issuer_url = "https://mysignin.internal.mycompany.com/" console_url = "https://console.aws.amazon.com/" signin_url = "https://signin.aws.amazon.com/federation" session_json = { :sessionId => assume_credential.credentials[:access_key_id], :sessionKey => assume_credential.credentials[:secret_access_key], :sessionToken => assume_credential.credentials[:session_token] }.to_json get_signin_token_url = signin_url + "?Action=getSigninToken" + "&SessionType=json&Session=" + CGI.escape(session_json) returned_content = URI.parse(get_signin_token_url).read signin_token = JSON.parse(returned_content)['SigninToken'] signin_token_param = "&SigninToken=" + CGI.escape(signin_token) issuer_param = "&Issuer=" + CGI.escape(issuer_url) destination_param = "&Destination=" + CGI.escape(console_url) login_url = signin_url + "?Action=login" + signin_token_param + issuer_param + destination_param
  27. AWS Deep Night in 福岡 Part.2 54 AWSへのログイン情報の管理 単独アカウント・Organizationsの親アカウントの場合 #

    AWS SDK for Ruby assume_credential = Aws::AssumeRoleCredentials.new( client: Aws::STS::Client.new, role_arn: "arn:aws:iam::#{family_account_id}:role/OrganizationAccountAccessRole", role_session_name: "SessinName", policy: "Policy", ) issuer_url = "https://mysignin.internal.mycompany.com/" console_url = "https://console.aws.amazon.com/" signin_url = "https://signin.aws.amazon.com/federation" session_json = { :sessionId => assume_credential.credentials[:access_key_id], :sessionKey => assume_credential.credentials[:secret_access_key], :sessionToken => assume_credential.credentials[:session_token] }.to_json get_signin_token_url = signin_url + "?Action=getSigninToken" + "&SessionType=json&Session=" + CGI.escape(session_json) returned_content = URI.parse(get_signin_token_url).read signin_token = JSON.parse(returned_content)['SigninToken'] signin_token_param = "&SigninToken=" + CGI.escape(signin_token) issuer_param = "&Issuer=" + CGI.escape(issuer_url) destination_param = "&Destination=" + CGI.escape(console_url) login_url = signin_url + "?Action=login" + signin_token_param + issuer_param + destination_param そもそもIAMの作成の必要もないので、さらに楽
  28. AWS Deep Night in 福岡 Part.2 55 AWSへのログイン情報の管理 • 煩雑なAWSへのログインを簡略化

    • 個人が管理するMFAがそもそも必要なくなる • 個人への依存軽減 • IDプロバイダーなどの事前準備が必要ない • 将来的に連携も容易
  29. AWS Deep Night in 福岡 Part.2 56 AWSへのログイン情報の管理 • 煩雑なAWSへのログインを簡略化

    • 個人が管理するMFAがそもそも必要なくなる • 個人への依存軽減 • IDプロバイダーなどの事前準備が必要ない • 将来的に連携も容易 ていう、Webアプリを鋭意作成中
  30. AWS Deep Night in 福岡 Part.2 59 • 社内の経理的なお話 •

    受託、自社サービスなど案件ごとにAWSアカウントは 別で運用している • 各案件ごとのAWS利用料は原価として処理したい • 原価として計上するのであれば、もちろん正確な金額 が望ましい AWSの利用料の原価について
  31. AWS Deep Night in 福岡 Part.2 60 • 単独アカウントの場合 •

    問題なし • 対象アカウントに請求される金額が原価となる • 一括請求(Organizations)アカウントの場合 • 問題にぶち当たる • 一括請求アカウントの請求画面に表示される各アカウントご との金額はあまり正確な金額ではないことを知る AWSの利用料の原価について
  32. AWS Deep Night in 福岡 Part.2 62 • どう正確じゃないのか •

    画面に表示されている金額は「ブレンドコスト」 • 「ブレンドコスト」とは • Organizations 内での料金最適化のために用いられるコスト • Organizationsにおける全ての利用料を、各サービスごとにまと めの平均レートを算出、これに各アカウントの使用量(時 間)を掛けたものが「ブレンドコスト」 • 何が問題か • リザーブドインスタンスを購入しているアカウントにも EC2の料金が計上されてしまう AWSの利用料の原価について
  33. AWS Deep Night in 福岡 Part.2 63 ※ 1ヶ月を720hとする ※

    EC2はt2.small, 単価 $0.03/h とする • Organizations 親アカウント • ファミリーアカウント① • リザーブド: 所有(全額前払い済) • EC2 利用時間:720h • 期待する金額:$0 • ブレンドレート:$0.015/h(=$21.6 / (720h + 720h)) • ブレンドコスト:$10.18(=$0.015 * 720h) • ファミリーアカウント② • リザーブド:未所持 • EC2 利用時間:720h • 期待する金額:$21.6(=720h × $0.03) • ブレンドレート:$0.015/h(=$21.6 / (720h + 720h)) • ブレンドコスト:$10.18(=$0.015 * 720h) AWSの利用料の原価について
  34. AWS Deep Night in 福岡 Part.2 64 ※ 1ヶ月を720hとする ※

    EC2はt2.small, 単価 $0.03/h とする • Organizations 親アカウント • ファミリーアカウント① • リザーブド: 所有(全額前払い済) • EC2 利用時間:720h • 期待する金額:$0 • ブレンドレート:$0.015/h(=$21.6 / (720h + 720h)) • ブレンドコスト:$10.18(=$0.015 * 720h) • ファミリーアカウント② • リザーブド:未所持 • EC2 利用時間:720h • 期待する金額:$21.6(=720h × $0.03) • ブレンドレート:$0.015/h(=$21.6 / (720h + 720h)) • ブレンドコスト:$10.18(=$0.015 * 720h) AWSの利用料の原価について 全体の請求金額で損をしているわけではない。 むしろ、S3など単価が安くなるものは得をしている しかし、原価計算という面で、リザーブドの金額が反 映されないのはあまりにも…
  35. AWS Deep Night in 福岡 Part.2 67 • 「コストと使用状況レポート」 •

    AWSが提供するコストに関するCSVレポート • 無料で利用可能(S3へ保存するためその料金は発生) • どのアカウントがどのサービスをどのくらい使ったのか、詳 細に記述されている • CSVの行数は膨大だが、Redshiftへの取り込みも容易 • リザーブドインスタンスの使用状況も確認可能 • 「非ブレンドコスト」という項目がある AWSの利用料の原価について
  36. AWS Deep Night in 福岡 Part.2 69 • 非ブレンドコスト •

    ブレンドコストを計算する際に用いられる値 • EC2、S3の単価(に近い)に使用量を掛けた金額 • 通常の感覚に近い金額 AWSの利用料の原価について
  37. AWS Deep Night in 福岡 Part.2 70 • 非ブレンドコスト •

    ブレンドコストを計算する際に用いられる値 • EC2、S3の単価(に近い)に使用量を掛けた金額 • 通常の感覚に限りなく近い金額 • ファミリーアカウント① • リザーブド: 所有(全額前払い済) • EC2 利用時間:720h • 期待する金額:$0 • ブレンドコスト:$10.18 • 非ブレンドコスト:$0 • ファミリーアカウント② • リザーブド:未所持 • EC2 利用時間:720h • 期待する金額:$21.6(=720h × $0.03) • ブレンドコスト:$10.18 • 非ブレンドコスト:$21.6 AWSの利用料の原価について
  38. AWS Deep Night in 福岡 Part.2 71 • 非ブレンドコスト •

    ブレンドコストを計算する際に用いられる値 • EC2、S3の単価(に近い)に使用量を掛けた金額 • 通常の感覚に限りなく近い金額 • ファミリーアカウント① • リザーブド: 所有(全額前払い済) • EC2 利用時間:720h • 期待する金額:$0 • ブレンドコスト:$10.18 • 非ブレンドコスト:$0 • ファミリーアカウント② • リザーブド:未所持 • EC2 利用時間:720h • 期待する金額:$21.6(=720h × $0.03) • ブレンドコスト:$10.18 • 非ブレンドコスト:$21.6 AWSの利用料の原価について 非ブレンドコストを用いることで、 ある程度正確な金額は算出可能
  39. AWS Deep Night in 福岡 Part.2 72 • アンケートへの回答などでもらえるクーポンは、どの アカウントに適用されるか分からない

    • 感覚的に利用金額が多いアカウントが多い • 「コストと使用状況レポート」ではマイナス計上項目も記載 • クーポンがどのアカウントに適用されてか確認可能 AWSの利用料の原価について
  40. AWS Deep Night in 福岡 Part.2 73 • アンケートへの回答などでもらえるクーポンは、どの アカウントに適用されるか分からない

    • 感覚的に利用金額が多いアカウントが多い • 「コストと使用状況レポート」ではマイナス計上項目も記載 • クーポンがどのアカウントに適用されてか確認可能 • 非ブレンドレートが実際の単価とずれることもある • リザーブドを使い切っていないアカウントがあった場合、他 の同じファミリータイプを使用するアカウントに割引が適用 され単価自体がずれてしまうため • リザーブドがどのEC2に適用されたかをレポート内で確認可能 AWSの利用料の原価について
  41. AWS Deep Night in 福岡 Part.2 74 • アンケートへの回答などでもらえるクーポンは、どの アカウントに適用されるか分からない

    • 感覚的に利用金額が多いアカウントが多い • 「コストと使用状況レポート」ではマイナス計上項目も記載 • クーポンがどのアカウントに適用されてか確認可能 • 非ブレンドレートが実際の単価とずれることもある • リザーブドを使い切っていないアカウントがあった場合、他 の同じファミリータイプを使用するアカウントに割引が適用 され単価自体がずれてしまうため • リザーブドがどのEC2に適用されたかをレポート内で確認可能 AWSの利用料の原価について 頑張ってCSVの内容を解析すれば、 原価と近しい金額は算出可能 Fusicでは現在、解析用のアプリケーションを運用中
  42. AWS Deep Night in 福岡 Part.2 • 新・3大 AWSの管理で味わった「つらみ」 •

    アカウント発行時の面倒さ • AWS Organizations の機能を利用して「対応」 • AWSへのログイン情報の管理 • IAMのフェデレーション機能を用いて「対応(予定)」 • AWSの利用料の原価について • 「コストと使用状況レポート」を解析し「対応」 75 まとめ