Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TerraformによるAWSマルチアカウント管理 in eureka, Inc.
Search
Daichi Harada
July 30, 2019
Programming
3
3.5k
TerraformによるAWSマルチアカウント管理 in eureka, Inc.
X-Tech JAWS & JAWS-UGアーキテクチャ専門支部 コラボ勉強会#02
https://jawsug-arch.connpass.com/event/135191/
Daichi Harada
July 30, 2019
Tweet
Share
More Decks by Daichi Harada
See All by Daichi Harada
パフォーマンス定点観測会の取り組み
dharada1
1
4.8k
新卒1年目のSREがコンテナをデプロイできるようになるまでの道のり [JAWS DAYS 2019]
dharada1
31
12k
Other Decks in Programming
See All in Programming
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
470
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
2
660
Ethereum_.pdf
nekomatu
0
460
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
190
Snowflake x dbtで作るセキュアでアジャイルなデータ基盤
tsoshiro
2
520
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
現場で役立つモデリング 超入門
masuda220
PRO
15
3.2k
Macとオーディオ再生 2024/11/02
yusukeito
0
370
Jakarta Concurrencyによる並行処理プログラミングの始め方 (JJUG CCC 2024 Fall)
tnagao7
1
290
AWS IaCの注目アップデート 2024年10月版
konokenj
3
3.3k
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Making Projects Easy
brettharned
115
5.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
Scaling GitHub
holman
458
140k
Practical Orchestrator
shlominoach
186
10k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Transcript
Terraformによる AWSマルチアカウント管理 in eureka, Inc. Daichi Harada / 2019.07.30 X-Tech
JAWS & JAWS-UGアーキテクチャ専門支部 コラボ勉強会#02
アジェンダ - 自己紹介 / eureka について - eureka における Infrastructure
as Code - 最近の悩み - AWS マルチアカウント化を進めている話 - terraform でマルチアカウント管理をうまくやる方法 - terraform module のつかいどころ - terraform の multi provider のつかいどころ
DAICHI HARADA - @kai_ten_sushi / @dharada1 - SRE at eureka,
Inc. - 2018 年新卒入社 - 好き - terraform / AWS / datadog / go - 勉強中 - kubernetes / fastly
eureka, Inc. - 事業 - Pairs ( 日本 / 台湾
/ 韓国 ) - Couples - Pairs エンゲージ ← ❗❗
Eureka Engineering Team - エンジニア - 50 名 - SRE
- 5 名 - すべてのサービスのインフラを管 轄 - オウンドメディア / コーポレートサイ トなど含む - Data Pipeline - Security - Audit
Eureka Engineering Team - 開発チームも最近 AWS を使い始めている - Rekognition のサービス導入
(API Developer) - CloudFront + Lambda@Edge による画像変換 & 配信シ ステム - マネージド機械学習サービスの検証 AWS AI Service Seminarに登壇しました! https://medium.com/eureka-engineering/aws-ai-se rvice-seminar-87a6de178886 CloudFront + Lambda@Edge
Infastructure as Code tools in Eureka - Provisioning - Terraform
- Pairs / Pairs Engage はすべてがコード管理下に - Ansible + Packer - golden image (ami) + immutable infrastructure model - Serverless - Serverless Framework - 画像変換機構の一部で Pairs での利用実績あり ( Cloudfront + Lambda@Edge ) - Container - ECS - Pairs 日台韓 - Kubernetes - 投稿審査マイクロサービス
最近
新サービスのリリース 新サービス リリース するぞォ! ・異なるサービスは分離して管理したい。 ・リリースまで、スピード重視で小回りを効かせていきたい。 ・既存のコンポーネントに影響出し得ない形でやっていきたい 新サービス リリース するぞォ!
新サービス リリース するぞォ!
監査/セキュリティ/会計 wordpressの セキュリティ大 丈夫 ? 監査・セキュリティ対応 コストは、どこの部署 / サービスでどのぐらい使ってるのか把握したい。 監査で〜す
WebOps費用 どんぐらい 使ってんの〜
エンジニアからの要求 Rekognition 検証したい んだけど〜 ISUCONの 練習環境 立ててよ! Slack Bot 作ったから
デプロイよろ♪ ホビー・プロジェクト、野良プロジェクト、検証環境のニーズが増してきた。 → 最低限のセキュリティ要件は守りつつ、開発者へのセルフサービス化を行いたい。 また、それらが本番環境や本気サービスに影響しないようにしたい。
新サービス リリース するぞォ! 監査で〜す wordpressの セキュリティ大 丈夫 ? WebOps費用 どんぐらい
使ってんの〜 ISUCONの 練習環境 立ててよ! Slack Bot 作ったから デプロイよろ♪ Rekognition 検証したい んだけど〜
勢いがある❗
Multi Account in AWS (AWS Organization)
Multi Account in AWS (AWS Organization) https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_getting-started_concepts.html AWS Organization
マルチアカウントで実現したいこと - Security / Audit / Financial Report - 締めるところ、当然やる
- 請求情報 / 監査用ログ の集約 - 権限管理 - 影響範囲の分離 - マルチアカウントはリソース境界を分ける強力な手段 - サービス毎に分離 - ステージ毎に分離 - セキュリティレベルで分離 - 権限委譲 ( 開発スピードの担保 ) - 開発者は自由に使える検証環境がほしい - コントローラブルな状態を保ちつつ、ほどよく権限移譲していく
全体像 ︙ prod-xxxxx stage-xxxxx sandbox @eure.jpのアカウント IDaaS グループ管理 各アカウント共通のコンポーネント (あとで説明します)
- IAM Role + Okta Integration - Datadog Integration - EC2 Auto-Patcher (Inspector+Lambda) - AWS Event Notify (Lambda) - etc. Master Account ( 請求情報 ) すべてのAWSアカウントを監視 Master Accountでは CloudTrailログの集約や 請求情報を統一して管理 (Consolidated Billing) している
アカウントの切り方 - Master Account - eureka-paid ( 命名は Consolidated Billing
のなごり ) - サービス単位での分割 - pairs / couples / corporate ... - prod/stage - prod-xxxxx / stage-xxxxx - sandbox - eureka-sandbox - ml-sandbox
マルチアカウントで こまった事
管理が面倒... - IAM ユーザーの管理が行き届かない - コンソールのログインやり直しがいちいち面倒 - アカウントごとに監視できてたり出来てなかったりする - 新規アカウント発行の腰が重い
共通で利用したいリソースが多い - IAM Role 設計 - infra_developer / api_developer /
read_only … - 外部サービスインテグレーション - Okta (IDaaS) を導入して各アカウントへの SAML を実現する - Datadog ( 監視 ) - VPC Peering - ssh 用 bastion サーバの VPC と peering が必要 - Lambda - aws-event-notify - インスタンスの退役予告を Slack 通知してくれる - Auto-Patcher - (Inspector + SNS + Lambda + SSM)
作成/変更の手間 - 新規作成 - 素朴に全部コピペして terraform apply するのは大変すぎる ... -
変更 - 運用ツール・仕組みの標準化 - 差分を許容したくなかった
terraform moduleで解決
共通の初期要件をmodule化 - アカウント毎に module を呼び出す と、初期要件のリソースが全部立 ち上がるようにした - VPC 設計、サービス名、
env (prod/stage) などの変数を入れて呼 び出す - 実体のリソース数は多めだが呼び出 し側では隠蔽 - terraform apply するだけ、手作業なし https://www.terraform.io/docs/configuration/modules.html
aws_account_bootstrap moduleの使い方 - アカウントごとに module を呼び出 すだけ。 module "aws_account_bootstrap" {
// module呼び出し source = "../../global_modules/aws_account_bootstrap" // 新規作成した AWSアカウントの IDを渡す aws_caller_identity = "${data.aws_caller_identity.current.account_id}" // CIDR設計を外から指定 vpc_cidr = "10.11.0.0/16" zone_1a = "ap-northeast-1b" zone_1c = "ap-northeast-1c" subnet_public_1a = "10.11.10.0/24" subnet_public_1c = "10.11.11.0/24" subnet_private_1a = "10.11.20.0/24" subnet_private_1c = "10.11.21.0/24" // VPC Peering 用 (既存のbastion側のVPC IDを渡す) peering_vpc_id = "vpc-xxxxxx" peering_vpc_public_route_table_id = "rtb-xxxxxx" peering_vpc_private1a_route_table_id = "rtb-xxxxxx" peering_vpc_private1c_route_table_id = "rtb-xxxxxx" // AWSのリソースに振るタグ tag_name = "eureka" tag_env = "prod" // Datadogのメトリクスに付くタグ datadog_aws_integration_host_tag = "account:eureka" } // Provider // 新規発行したアカウントのキーを指定 (ファイルごとに分けているが profileでも可) provider "aws" { region = "${var.vpc["region"]}" shared_credentials_file = "/path/to/my/credentials" version = "= 1.52.0" } // Providerに食わせた AWSアカウントの情報を取得できる。 data "aws_caller_identity" "current" {}
共通のリソースは moduleで再利用する
AWS + Okta Integration - SSO ツールの Okta を利用 -
ワンクリックで各アカウントへ - IAM Role へのフェデレーションアクセス - ユーザーと権限の紐付けは Okta 側での管理
AWS + Okta Integration - bootstrap のテンプレートには Okta とのインテ グレーション用のリソースを定義
- aws_iam_user - aws_iam_policy - aws_iam_user_policy_attachment resource "aws_iam_user" "okta" { name = "okta" path = "/" } resource "aws_iam_policy" "okta" { name = "OktaMasterAccountPolicy" policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:ListRoles", "iam:ListAccountAliases" ], "Resource": "*" } ] } EOF } resource "aws_iam_user_policy_attachment" "okta" { depends_on = [ "aws_iam_user.okta", "aws_iam_policy.okta", ] user = "${aws_iam_user.okta.name}" policy_arn = "${aws_iam_policy.okta.arn}" }
IAM Role - Role 設計は全 AWS アカウントで共通 - admin -
infra_developer - SRE が日常的に利用する - api_developer - dynamo / sqs / s3 など一部頻繁に発生する ものの create 権限 - ml_developer - ML 系マネージドサービス - bi_developer - athena とか - read_only - read only. - IAM User はなるべく作成しない - キーの管理など面倒なので
サービスをまたぐ インテグレーションを terraformで表現
AWS + Datadog Integration - AWS 側に IAM Role を作成
- Datadog 側で吐き出した AWS External ID の指定 - 「 Datadog の」 AWS アカウントに操作を許可する - Datadog 側でアカウント ID と IAM Role 名、監視対象の設定
AWS + Datadog Integration - 複数アカウント運用する場合正 直手作業はしんどい - マルチプロバイダーを使えば terraform
apply 1 回でインテグ レーション可能
例1. Fastly + BigQuery - コード例を乗せる // Datadogが利用するIAM Role resource
"aws_iam_role" "datadog_aws_integration" { depends_on = [ "datadog_integration_aws.aws", ] name = "DatadogAWSIntegrationRole" description = "Role for Datadog AWS Integration" assume_role_policy = "${data.aws_iam_policy_document.datadog_aws_integration_assume_role.json}" } // IAMポリシー data "aws_iam_policy_document" "datadog_aws_integration_assume_role" { statement { actions = ["sts:AssumeRole"] principals { type = "AWS" identifiers = ["arn:aws:iam::464622532012:root"] // DatadogのAWSアカウント } condition { test = "StringEquals" variable = "sts:ExternalId" values = [ "${datadog_integration_aws.aws.external_id}", ] } } } // Datadog側のIntegrationを定義 resource "datadog_integration_aws" "aws" { provider = "datadog.datadog" account_id = "${data.aws_caller_identity.current.account_id}" role_name = "DatadogAWSIntegrationRole" // AWS側で作成する IAM Role名 host_tags = [ "${var.datadog_aws_integration_host_tag}", ] } // moduleを呼ぶ側 … マルチプロバイダー指定 provider "aws" { region = "${var.region}" shared_credentials_file = "/path/to/credfile" version = "= 2.11.0" } provider "datadog" { alias = "datadog" version = "=1.9.0" } // Providerに食わせた AWSアカウントの情報を取得できる。 data "aws_caller_identity" "current" {}
例1. Fastly + BigQuery - コード例を乗せる // Datadog側のIntegrationを定義 resource "datadog_integration_aws"
"aws" { provider = "datadog.datadog" account_id = "${data.aws_caller_identity.current.account_id}" role_name = "DatadogAWSIntegrationRole" // AWS側で作成する IAM Role名 host_tags = [ "${var.datadog_aws_integration_host_tag}", ] } // moduleを呼ぶ側 … マルチプロバイダー指定 provider "aws" { region = "${var.region}" shared_credentials_file = "/path/to/credfile" version = "= 2.11.0" } provider "datadog" { alias = "datadog" version = "=1.9.0" } // Providerに食わせた AWSアカウントの情報を取得できる。 data "aws_caller_identity" "current" {} - aws のアカウント ID を provider のク レデンシャルから取得 - Datadog 側の Integration 用リソー スに与えることでインテグレーショ ンが可能
AWSアカウントをまたぐ VPC Peering
Cross-Account VPC Peering - Bastion サーバからの ssh を開通したい。 - VPC
Peering してあげないと ssh できない - 複数のアカウントをまたぐ Peering ってどうやる の? - Peering リクエスト、アクセプターという概念 - 毎回手作業はしんどい - これもマルチプロバイダーを使うと 1 apply で 開通可能。 - alias をはって、複数アカウントのリソースを一気 に作れる。
例1. Fastly + BigQuery - コンソールでのアクセプト作業を terraform で表現可能 - provider
の alias を明示的に指定して利用 - 異なる provider のリソースも普通に呼び合うことができる - 例 … aws_vpc_peering_connection.peering.id // generalのアカウントから、新しい awsアカウントへの peering resource "aws_vpc_peering_connection" "peering" { provider = "aws.general" vpc_id = "${data.aws_vpc.peering_vpc.id}" peer_owner_id = "${data.aws_caller_identity.current.account_id}" peer_vpc_id = "${aws_vpc.vpc.id}" auto_accept = "false" } // 新規awsアカウントから、アクセプトする。 resource "aws_vpc_peering_connection_accepter" "general_to_new_vpc" { vpc_peering_connection_id = "${aws_vpc_peering_connection.peering.id}" auto_accept = "true" tags = { Side = "Accepter" } } // 1つめのaws provider // (新しく作るアカウントの方 ) provider "aws" { region = "${var.region}" shared_credentials_file = "/path/to/credfile" version = "= 2.11.0" } // エイリアスをはると //2つめのaws providerを使える // (bastionサーバが置いてあるアカウント ) provider "aws" { alias = "general" region = "${var.region}" shared_credentials_file = "/path/to/credfile" version = "= 2.11.0" }
例1. Fastly + BigQuery - コンソールでのアクセプト作業を terraform で表現可能 - provider
の alias を明示的に指定して利用 - 異なる provider のリソースも普通に呼び合うことができる - 例 … aws_vpc_peering_connection.peering.id // generalのアカウントから、新しい awsアカウントへの peering resource "aws_vpc_peering_connection" "peering" { provider = "aws.general" vpc_id = "${data.aws_vpc.peering_vpc.id}" peer_owner_id = "${data.aws_caller_identity.current.account_id}" peer_vpc_id = "${aws_vpc.vpc.id}" auto_accept = "false" } // 新規awsアカウントから、アクセプトする。 resource "aws_vpc_peering_connection_accepter" "general_to_new_vpc" { vpc_peering_connection_id = "${aws_vpc_peering_connection.peering.id}" auto_accept = "true" tags = { Side = "Accepter" } } // 1つめのaws provider // (新しく作るアカウントの方 ) provider "aws" { region = "${var.region}" shared_credentials_file = "/path/to/credfile" version = "= 2.11.0" } // エイリアスをはると //2つめのaws providerを使える // (bastionサーバが置いてあるアカウント ) provider "aws" { alias = "general" region = "${var.region}" shared_credentials_file = "/path/to/credfile" version = "= 2.11.0" }
まとめ
まとめ - eureka では 複数の AWS アカウント を terraform で運用している
- terraform module でテンプレを作ると、共通リソース管理が楽になる - IAM 設計、運用ツール系の lambda などを全アカウントに展開、運用していきやすくなる - 標準化されたガードレールを設けて、セキュリティやコンプライアンスの要件を守る - そのうえで開発者に権限を委譲、セルフサービス化していく - multi provider でアカウントやクラウドをまたいだリソース管理が可能 - AWS アカウントをまたぐ VPC Peering も一発で貼ることができる - provider の alias を使う - 他クラウドプロバイダーとの連携もコードで表現できるのは、 terrafrorm の長所