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
AWSとTerraform初心者がやってみたこと
Search
masa-ita
December 21, 2019
Technology
530
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AWSとTerraform初心者が やってみたこと
masa-ita
December 21, 2019
More Decks by masa-ita
See All by masa-ita
Ollamaを使ったLocal Language Model活用法
itagakim
1
240
Run Instant NeRF on Docker
itagakim
1
2.4k
3D Clustering and Metric Learning
itagakim
0
420
Cloud TPUの使い方〜BigBirdの日本語学習済みモデルを作る〜
itagakim
0
750
多言語学習済みモデルmT5とは?
itagakim
1
800
AWSのGPUを安く使ってTensorFlowモデルを訓練する方法
itagakim
0
420
最近の自然言語処理モデルの動向
itagakim
1
600
ディープラーニングで芸術はできるか?〜生成系ネットワークの進展〜
itagakim
0
390
IntroductionToTensorFlow2_0.pdf
itagakim
1
390
Other Decks in Technology
See All in Technology
Sets in Go
ramalho
1
1.2k
도구에서 동료까지: 10년차 AI 스타트업의 AI 적응기
inureyes
PRO
1
330
あなたの知らないバージョン命名規則
sat
PRO
2
190
20260817_生成AIの動向と中学校・高等学校での活用を考える_v1.00_公開用
doradora09
PRO
0
200
強化学習「理論」入門
enakai00
3
3.6k
安全性・開発速度・ユーザー体験の あいだで考える 事業会社のプロダクトセキュリティ
mixi_engineers
PRO
0
100
暗号化?某ファイルストレージはどうなるの!? 3rd Partyとうまく付き合う秘密度ラベル設計
kasada
0
150
地震情報アプリを作ってみた
yama3133
1
110
AI時代のアウトプット――変わったこと、変わらないこと / Devsumi 2026 Kansai #devsumi
jnchito
0
520
AIに持続⼒を与える 判断の⻑期記憶設計
eiei114
1
670
Kiro Crew入門 - 常駐エージェントの仕組みと使いどころ / Intro to Kiro Crew
k_adachi_01
1
820
[potatotips #96] Give Your AI Agent the Flutter Playbook
korodroid
0
150
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
440
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
800
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
The Limits of Empathy - UXLibs8
cassininazir
1
610
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
Done Done
chrislema
186
16k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Transcript
AWSとTerraform初⼼者が やってみたこと 板垣 正敏@JAWS-UG Niigata 2019/12/21
⾃⼰紹介 • 板垣 正敏 • 県内IT企業の技術顧問(2020/3まで) • 中⼩企業診断⼠ • ⽇本Rubyの会
• 新潟オープンソース協会 • Python機械学習勉強会 in 新潟 • TensorFlow Users Group • @itagakim • https://github.com/masa-ita • AWS歴 2017年〜
システムの全体像
なんのためのシステムか? • 社内でのディープラーニング 実習のための環境 • GPUマシンをたくさん⽤意で きない • GPUインスタンスは使うとき だけ起動して、コストを抑え
たい • IPアドレスを意識せずに使い たい • 当初はGUIコンソールとSSHで ⼿作業で構築 • Dynamic DNSとLet’s Encryptで 構成 • 現在はELBとCertificate Managerを使⽤
AWS Lambda EC2起動・停⽌指⽰ Amazon API Gateway DDNS登録・削除 Amazon DynamoDB Amazon
EC2 Amazon Route 53 Application Load Balancer Amazon CloudWatch Amazon Elastic Block Store Amazon Elastic File System EC2起動・停⽌完了通知 EC2稼働定期通知 AWS Identity and Access Management Generic group Event (time-based) Event (event-based) Event (event-based) AWS Certificate Manager VPC WebHook API call API call API call
本題:Terraformとは?
Infrastructure AS Code • コードとしてのインフラ(構成) • 再現・再利⽤性 • 設定ミス・設定漏れの防⽌ •
GUIによらないドキュメント化 • バージョン管理
なぜTERRAFORM? • AWSならCloudFormationがあるが・・・ • Azure, GCP, オンプレ(Vmware, Nutanix, etc.):ワークフ ローの統⼀
• https://www.terraform.io/docs/providers/index.html
TERRAFORMのしくみ • terraform init • terraform validate • terraform plan
• terraform apply .tf .tfstate .tfplan Target System terraform plan terraform apply
TERRAFORMのインストール • プラットフォームごとにZIPファイルで提供 • シングルバイナリでパスが通っていればOK • MacOSならHomebrewでもインストール可能 • tfenvでバージョン管理も
構成例 Labmdaを⽤いたDynamic DNSの部分のみを紹介
プロバイダ設定 • クレデンシャルは環境変数か awscliの設定ファイルに保存 すべき • バージョンアップでの⾮互換 を防ぐため、Terraformやプロ バイダのバージョン指定が有 効
• 右の例では、.tfstateファイル をS3バケットに保存している (共同作業やリモート参照の ため) terraform { required_version = "0.12.17” backend "s3" { bucket = "tfstate-terraform-demo” key = "network/terraform.tfstate” region = "ap-northeast-1” } } provider "aws" { version = "~> 2.41” region = "ap-northeast-1” }
variable "name" {} variable "policy" {} variable "identifier" {} resource
"aws_iam_role" "default" { name = var.name assume_role_policy = data.aws_iam_policy_document.assume_role.json } data "aws_iam_policy_document" "assume_role" { statement { actions = ["sts:AssumeRole"] principals { type = "Service” identifiers = [var.identifier] } } } resource "aws_iam_policy" "default" { name = var.name policy = var.policy } resource "aws_iam_role_policy_attachment" "default" { role = aws_iam_role.default.name policy_arn = aws_iam_policy.default.arn } output "iam_role_arn" { value = aws_iam_role.default.arn } output "iam_role_name" { value = aws_iam_role.default.name } IAM設定⽤モジュール定義
data "aws_iam_policy_document" "for_ddns_lambda" { statement { effect = "Allow” actions
= ["ec2:Describe*"] resources = ["*"] } statement { effect = "Allow” actions = ["dynamodb:*"] resources = ["*"] } statement { effect = "Allow” actions = [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents” ] resources = ["*"] } statement { effect = "Allow” actions = ["route53:*"] resources = ["*"] } } module "role_for_ddns_lambda" { source = "./iam_role” name = "role_for_ddns_lambda” identifier = "lambda.amazonaws.com” policy = data.aws_iam_policy_document.for_ddns_lambda.json } Lambda関数⽤IAM定義
data "archive_file" "lambda_function" { type = "zip” source_dir = "lambda/function”
output_path = "lambda/upload/lambda_function.zip” } resource "aws_lambda_function" "ddns_lambda" { filename = data.archive_file.lambda_function.output_path function_name = "ddns_lambda” role = module.role_for_ddns_lambda.iam_role_arn handler = "union.lambda_handler” source_code_hash = data.archive_file.lambda_function.output_base64sha256 runtime = "python2.7” memory_size = 128 timeout = 120 } resource "aws_lambda_permission" "allow_cloudwatch" { statement_id = "AllowExecutionFromCloudWatch” action = "lambda:InvokeFunction” function_name = aws_lambda_function.ddns_lambda.function_name principal = "events.amazonaws.com” source_arn = aws_cloudwatch_event_rule.ec2_lambda_ddns_rule.arn } Lambda関数定義
resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16” enable_dns_support = true
enable_dns_hostnames = true tags = { Name = "main” } } resource "aws_subnet" "main" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24” map_public_ip_on_launch = true availability_zone = "ap-northeast-1d” tags = { Name = "main” } } resource "aws_internet_gateway" "gw" { vpc_id = aws_vpc.main.id tags = { Name = "main” } } resource "aws_route_table" "public" { vpc_id = aws_vpc.main.id } resource "aws_route" "public" { route_table_id = aws_route_table.public.id gateway_id = aws_internet_gateway.gw.id destination_cidr_block = "0.0.0.0/0” } resource "aws_route_table_association" "public" { subnet_id = aws_subnet.main.id route_table_id = aws_route_table.public.id } resource "aws_vpc_dhcp_options" "aws_subdomain" { domain_name = "aws.rails.to” domain_name_servers = ["AmazonProvidedDNS"] tags = { Name = "aws_subdomain” } } output "vpc_id" { value = aws_vpc.main.id } output "main_subnet_id" { value = aws_subnet.main.id } VPC定義
variable "name" {} variable "vpc_id" {} variable "port" {} variable
"cidr_blocks" { type = list(string) } resource "aws_security_group" "default" { name = var.name vpc_id = var.vpc_id } resource "aws_security_group_rule" "ingress" { type = "ingress” from_port = var.port to_port = var.port protocol = "tcp” cidr_blocks = var.cidr_blocks security_group_id = aws_security_group.default.id } resource "aws_security_group_rule" "egress" { type = "egress” from_port = 0 to_port = 0 protocol = "-1” cidr_blocks = ["0.0.0.0/0"] security_group_id = aws_security_group.default.id } output "security_group_id" { value = aws_security_group.default.id } Security Group定義⽤モジュール
module "web_server_sg" { source = "./security_group” name = "web-sg” vpc_id
= data.terraform_remote_state.network.outputs.vpc_id port = 80 cidr_blocks = ["0.0.0.0/0"] } resource "aws_instance" "web" { ami = "ami-0c3fd0f5d33134a76” instance_type = "t3.nano” vpc_security_group_ids = [module.web_server_sg.security_group_id] subnet_id = data.terraform_remote_state.network.outputs.main_subnet_id user_data = <<EOF #!/bin/bash yum install -y httpd systemctl start httpd.service EOF tags = { ZONE = "aws.rails.to.” CNAME = "web.aws.rails.to.” } } Security Group と EC2 インスタンスの定義
まとめ
Terraform は強⼒なツール • 何よりも構成の再現性がありがたい • GUIが時々変わるクラウドには必須のツールか • プロビジョニングの機能はそれほど便利ではない(ファイル コピーとコマンド実⾏) •
モジュールの使い⽅(使いどころ)がよくわかってません • 最適なリソース分割やディレクトリ配置がまだわかってませ ん
参考図書 • 「実践Terraform」野村友規著 • オンデマンド / Kindle • https://www.amazon.co.jp/dp/4844378139
参照サイト • Terraform Documentation • https://www.terraform.io/docs/index.html • Lamdaを⽤いたDynamic DNSの参考事例 •
https://aws.amazon.com/jp/blogs/compute/building-a-dynamic-dns-for- route-53-using-cloudwatch-events-and-lambda/ • https://github.com/aws-samples/aws-lambda-ddns-function
おまけ: Python機械学習勉強会 in 新潟 Restart #10 やり ます • 2020年1⽉11⽇(⼟)
• 新潟市中央公⺠館(クロスパル) • 「(仮)ディープラーニングで芸術はできるか?〜⽣成系ネッ トワークの進展〜」(itagakim) • 「機械学習による動作認識」(Oh!No!さん) • 「産学連携セミナー報告とインフラWG設⽴の提案」 (haru_fujitaさん) • 「Deep Learningを⽤いた残存⻭の⾃動認識」(historoidさん)