スピーカー
AWSってこんなんやってリソース作るんですよ
- イベント AWSってこんなんやってリソース作るんですよ 用の資料です。
前提
- この資料はAWSを触ったことがない人向けです。
- terraformでAWSリソースを作る勉強会の前段階の資料となります。
ごめんなさい
- 自分はオンプレミスのサーバやネットワークをあまり触ったことがないので、実機だとどの部分に該当するかなどわかっていないところがあります。
やらないこと
- AWSの会員登録手順
- AWS CLIのインストール手順
- terraformのインストール手順
AWSリソースの作り方を3種紹介します
作るもの
- EC2インスタンス(簡単に言うとLinuxサーバ)
作る方法
- AWSコンソールから
- AWS CLIから
- terraformから
AWSコンソールから作る
-
ログイン後のAWSコンソールはこんな感じです
-
マネージドサービスがいろいろあります
-
EC2(Elastic Compute Cloud)を選択します
-
いろいろありますが、「インスタンス作成」ボタンを押します
-
Amazonが用意している
Amazon Linux
や、Red hat
Microsoft Windows Server
などが選択できます。 -
Amazon Linux
を選択します。 -
インスタンスのタイプを選択します。
-
インスタンスタイプによってCPU数やメモリ、ネットワークパフォーマンスが決まります。
-
無料枠の「t2.miciro」インスタンスを選択します。
-
インスタンスのパラメータを指定します
-
インスタンス数: 何台作成するか
-
購入のオプション(スポットインスタンスのリクエスト): 説明略
-
ネットワーク: どこのネットワークに配置するか
-
サブネット: ネットワーク内のどのサブネットに配置するか
-
自動割当パブリックIP: グローバルIPを自動で割り当てるかどうか
-
IAMロール: 説明略
-
シャットダウン動作: シャットダウン時に停止状態にするか、削除してしまうか
-
削除保護の有効化: 誤って削除しないようにブロックするかどうか
-
モニタリング(CloudWatch詳細モニタリングを有効化): 説明略
-
テナンシー: 物理サーバを専有するかどうか
-
T2無制限: 説明略
-
どのようなストレージタイプをどれくらい載せるかを指定します。
-
ボリュームタイプ
- 汎用SSD: 汎用的なSSD
- プロビジョンドSSD: パフォーマンス重視のSSD
- マグネティック: 磁気ディスク
-
タグ付けをします。
-
セキュリティグループ(アクセス制限)を指定します。
-
確認画面です
-
SSHログインするためのキーペアを指定します。
-
今回は作成済みのキーペアを指定します。
-
完了画面です
-
インスタンス一覧を表示し、インスタンスが作成されていることが確認できます。
-
割り当てられたパブリックIPに対して、SSHログインしてみます
% ssh ec2-user@13.230.12.176 -i infra_study.pem __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2017.09-release-notes/ 1 package(s) needed for security, out of 1 available Run "sudo yum update" to apply all updates. [ec2-user@ip-172-31-27-130 ~]$
- デフォルトで
ec2-user
というユーザが用意されています。
AWS CLIから作る
- AWS CLI準備
- アクセスキー/シークレットキーというものが必要になります。
- aws clientをインストール します
% aws --version aws-cli/1.9.9 Python/2.7.10 Darwin/17.3.0 botocore/1.3.9
- セキュリティグループを作ります
% aws ec2 create-security-group \ --group-name aws-cli-sg \ --description "security group for EC2 from aws cli" % aws ec2 authorize-security-group-ingress \ --group-name aws-cli-sg \ --protocol tcp \ --port 22 \ --cidr 0.0.0.0/0
-
一つ目のコマンドでセキュリティグループを作成し、
-
二つ目のコマンドでアクセス制限を設定します。
-
インスタンスを起動します。
% aws ec2 run-instances \ --image-id ami-33c25b55 \ --count 1 \ --subnet-id subnet-eca4ce9b \ --associate-public-ip-address \ --security-group-ids sg-dfe764a6 \ --instance-type t2.micro \ --key-name infra_study \ --query 'Instances[0].InstanceId'
- 割り当てられたパブリックIPに対して、SSHログインしてみます
terraformで作る
- terraform準備
% terraform -v
- tfファイルを作ります。
### # # Provide # provider "aws" { region = "ap-northeast-1" } ### # # Security Group # resource "aws_security_group" "sample_server" { vpc_id = "vpc-14d70473" name = "sample_security_group" description = "sample" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } ### # # EC2 # resource "aws_instance" "sample_server" { ami = "ami-33c25b55" instance_type = "t2.micro" key_name = "infra_study" subnet_id = "subnet-847203cd" associate_public_ip_address = true vpc_security_group_ids = [ "${aws_security_group.sample_server.id}", ] tags { Name = "infra_study_from_terraform" } }
- dry-runします。
% terraform plan Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. The Terraform execution plan has been generated and is shown below. Resources are shown in alphabetical order for quick scanning. Green resources will be created (or destroyed and then created if an existing resource exists), yellow resources are being changed in-place, and red resources will be destroyed. Cyan entries are data sources to be read. Note: You didn't specify an "-out" parameter to save this plan, so when "apply" is called, Terraform can't guarantee this is what will execute. + aws_instance.sample_server ami: "ami-33c25b55" associate_public_ip_address: "true" availability_zone: "<computed>" ebs_block_device.#: "<computed>" ephemeral_block_device.#: "<computed>" instance_state: "<computed>" instance_type: "t2.micro" ipv6_address_count: "<computed>" ipv6_addresses.#: "<computed>" key_name: "infra_study" network_interface.#: "<computed>" network_interface_id: "<computed>" placement_group: "<computed>" primary_network_interface_id: "<computed>" private_dns: "<computed>" private_ip: "<computed>" public_dns: "<computed>" public_ip: "<computed>" root_block_device.#: "<computed>" security_groups.#: "<computed>" source_dest_check: "true" subnet_id: "subnet-847203cd" tags.%: "1" tags.Name: "infra_study_from_terraform" tenancy: "<computed>" volume_tags.%: "<computed>" vpc_security_group_ids.#: "<computed>" + aws_security_group.sample_server description: "sample" egress.#: "1" egress.482069346.cidr_blocks.#: "1" egress.482069346.cidr_blocks.0: "0.0.0.0/0" egress.482069346.from_port: "0" egress.482069346.ipv6_cidr_blocks.#: "0" egress.482069346.prefix_list_ids.#: "0" egress.482069346.protocol: "-1" egress.482069346.security_groups.#: "0" egress.482069346.self: "false" egress.482069346.to_port: "0" ingress.#: "1" ingress.2541437006.cidr_blocks.#: "1" ingress.2541437006.cidr_blocks.0: "0.0.0.0/0" ingress.2541437006.from_port: "22" ingress.2541437006.ipv6_cidr_blocks.#: "0" ingress.2541437006.protocol: "tcp" ingress.2541437006.security_groups.#: "0" ingress.2541437006.self: "false" ingress.2541437006.to_port: "22" name: "sample_security_group" owner_id: "<computed>" vpc_id: "vpc-14d70473" Plan: 2 to add, 0 to change, 0 to destroy.
- インスタンスを起動します。
terraform apply aws_security_group.sample_server: Refreshing state... (ID: sg-7206840b) aws_security_group.sample_server: Creating... description: "" => "sample" egress.#: "" => "1" egress.482069346.cidr_blocks.#: "" => "1" egress.482069346.cidr_blocks.0: "" => "0.0.0.0/0" egress.482069346.from_port: "" => "0" egress.482069346.ipv6_cidr_blocks.#: "" => "0" egress.482069346.prefix_list_ids.#: "" => "0" egress.482069346.protocol: "" => "-1" egress.482069346.security_groups.#: "" => "0" egress.482069346.self: "" => "false" egress.482069346.to_port: "" => "0" ingress.#: "" => "1" ingress.2541437006.cidr_blocks.#: "" => "1" ingress.2541437006.cidr_blocks.0: "" => "0.0.0.0/0" ingress.2541437006.from_port: "" => "22" ingress.2541437006.ipv6_cidr_blocks.#: "" => "0" ingress.2541437006.protocol: "" => "tcp" ingress.2541437006.security_groups.#: "" => "0" ingress.2541437006.self: "" => "false" ingress.2541437006.to_port: "" => "22" name: "" => "sample_security_group" owner_id: "" => "<computed>" vpc_id: "" => "vpc-14d70473" aws_security_group.sample_server: Creation complete after 2s (ID: sg-16088a6f) aws_instance.sample_server: Creating... ami: "" => "ami-33c25b55" associate_public_ip_address: "" => "true" availability_zone: "" => "<computed>" ebs_block_device.#: "" => "<computed>" ephemeral_block_device.#: "" => "<computed>" instance_state: "" => "<computed>" instance_type: "" => "t2.micro" ipv6_address_count: "" => "<computed>" ipv6_addresses.#: "" => "<computed>" key_name: "" => "infra_study" network_interface.#: "" => "<computed>" network_interface_id: "" => "<computed>" placement_group: "" => "<computed>" primary_network_interface_id: "" => "<computed>" private_dns: "" => "<computed>" private_ip: "" => "<computed>" public_dns: "" => "<computed>" public_ip: "" => "<computed>" root_block_device.#: "" => "<computed>" security_groups.#: "" => "<computed>" source_dest_check: "" => "true" subnet_id: "" => "subnet-847203cd" tags.%: "" => "1" tags.Name: "" => "infra_study_from_terraform" tenancy: "" => "<computed>" volume_tags.%: "" => "<computed>" vpc_security_group_ids.#: "" => "1" vpc_security_group_ids.175828163: "" => "sg-16088a6f" aws_instance.sample_server: Still creating... (10s elapsed) aws_instance.sample_server: Still creating... (20s elapsed) aws_instance.sample_server: Creation complete after 23s (ID: i-01af8b95d2f16d22e) Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
- 割り当てられたパブリックIPに対して、SSHログインしてみます。
まとめ
- AWSコンソール / AWS CLI / terraform どれでも同じリソースが作れます。
- 場面によって使い分けると良いかもです。
- AWSコンソール
- 作業用の使い捨てサーバをさっと作る
- AWS CLI
- プログラムからサーバを作る
- terraform
- 構成管理の基にサーバを作る
- AWSコンソール
次回予告
- AWS上に簡単なネットワーク構成を、terraformで作ってみたいと思います。