スピーカー

Anorlondo448さん

AWSってこんなんやってリソース作るんですよ

前提

  • この資料はAWSを触ったことがない人向けです。
  • terraformでAWSリソースを作る勉強会の前段階の資料となります。

ごめんなさい

  • 自分はオンプレミスのサーバやネットワークをあまり触ったことがないので、実機だとどの部分に該当するかなどわかっていないところがあります。

やらないこと

  • AWSの会員登録手順
  • AWS CLIのインストール手順
  • terraformのインストール手順

AWSリソースの作り方を3種紹介します

作るもの

  • EC2インスタンス(簡単に言うとLinuxサーバ)

作る方法

  • AWSコンソールから
  • AWS CLIから
  • terraformから

AWSコンソールから作る

  • ログイン後のAWSコンソールはこんな感じです スクリーンショット 2018-01-15 23.05.13.png

  • マネージドサービスがいろいろあります スクリーンショット 2018-01-15 23.10.20.png

  • EC2(Elastic Compute Cloud)を選択します スクリーンショット 2018-01-15 23.12.42.png

  • いろいろありますが、「インスタンス作成」ボタンを押します スクリーンショット 2018-01-15 23.14.13.png

  • Amazonが用意している Amazon Linux や、 Red hat Microsoft Windows Server などが選択できます。

  • Amazon Linux を選択します。

  • インスタンスのタイプを選択します。 スクリーンショット 2018-01-15 23.16.10.png

  • インスタンスタイプによってCPU数やメモリ、ネットワークパフォーマンスが決まります。

  • 無料枠の「t2.miciro」インスタンスを選択します。

  • インスタンスのパラメータを指定します スクリーンショット 2018-01-15 23.19.05.png

  • インスタンス数: 何台作成するか

  • 購入のオプション(スポットインスタンスのリクエスト): 説明略

  • ネットワーク: どこのネットワークに配置するか

  • サブネット: ネットワーク内のどのサブネットに配置するか

  • 自動割当パブリックIP: グローバルIPを自動で割り当てるかどうか

  • IAMロール: 説明略

  • シャットダウン動作: シャットダウン時に停止状態にするか、削除してしまうか

  • 削除保護の有効化: 誤って削除しないようにブロックするかどうか

  • モニタリング(CloudWatch詳細モニタリングを有効化): 説明略

  • テナンシー: 物理サーバを専有するかどうか

  • T2無制限: 説明略

  • どのようなストレージタイプをどれくらい載せるかを指定します。 スクリーンショット 2018-01-15 23.25.23.png

  • ボリュームタイプ

    • 汎用SSD: 汎用的なSSD
    • プロビジョンドSSD: パフォーマンス重視のSSD
    • マグネティック: 磁気ディスク
  • タグ付けをします。 スクリーンショット 2018-01-15 23.30.33.png

  • セキュリティグループ(アクセス制限)を指定します。 スクリーンショット 2018-01-15 23.31.32.png

  • 確認画面です スクリーンショット 2018-01-15 23.32.33.png

  • SSHログインするためのキーペアを指定します。 スクリーンショット 2018-01-15 23.32.55.png

  • 今回は作成済みのキーペアを指定します。

  • 完了画面です スクリーンショット 2018-01-15 23.33.46.png

  • インスタンス一覧を表示し、インスタンスが作成されていることが確認できます。 スクリーンショット 2018-01-15 23.34.58.png

  • 割り当てられたパブリック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 --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上に簡単なネットワーク構成を、terraformで作ってみたいと思います。