2018年10月7日日曜日

AWS を初めて触る状態から Packer を使ってインスタンスを作成してログインするまでをやってみる

Getting Start を見ながらやってみる。

環境・前提

Docker for Windows で hashicorp/packer のイメージを使う。

  • Host OS: Windows 10 Pro
  • image: hashicorp/packer:1.3.1
  • docker: Docker version 18.06.1-ce, build e68fc7a

AWS のアカウントは、作成だけした状態からスタート。

必要パッケージのインストール

docker pull するだけ。

docker pull hashicorp/packer:1.3.1

AWS の環境設定

Packer で AWS のリソースをいじるためには、 いろいろと権限が必要。

下記 3 つを作成する。

  • ポリシー
  • グループ
  • ユーザー

ポリシーの作成

必要な権限は Amazon AMI Builder のドキュメントに記載されている ので、この JSON をコピーしてポリシーを作る。

  1. AWS マネジメントコンソール -> サービス -> IAM -> ポリシー
  2. ポリシーの作成 -> JSON タブを開く -> 前述の JSON 定義を貼り付け -> Review policy
  3. 名前、説明を記述 -> Create policy
    1. ポリシー名: packer-basic

グループの作成

  1. AWS マネジメントコンソール -> サービス -> IAM -> グループ
  2. 新しいグループの作成 -> グループ名入力 -> 次のステップ
    1. グループ名: Packer
  3. packer-basic のポリシーをアタッチ -> 次のステップ
  4. グループの作成

ユーザーの作成

  1. AWS マネジメントコンソール -> サービス -> IAM -> ユーザー
  2. ユーザーを追加 -> ユーザー名、アクセスの種類を入力 -> 次のステップ
    1. ユーザー名: mikoto2000-packer
    2. アクセスの種類: プログラムによるアクセス
  3. アクセス許可の設定 -> 次のステップ
    1. ユーザーをグループに追加を選択
    2. グループ Packer を追加する
  4. ユーザーの作成

作成直後に表示される、 アクセスキー IDシークレットアクセスキー をメモしておく。

イメージ作成用テンプレートの作成

ベーステンプレートファイルの作成

とりあえず、 Getting Start の JSON をまるっとコピーし、 getting_start.json として保存。

{
  "variables": {
    "aws_access_key": "",
    "aws_secret_key": ""
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "us-east-1",
    "source_ami_filter": {
      "filters": {
      "virtualization-type": "hvm",
      "name": "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*",
      "root-device-type": "ebs"
      },
      "owners": ["099720109477"],
      "most_recent": true
    },
    "instance_type": "t2.micro",
    "ssh_username": "ubuntu",
    "ami_name": "packer-example {{timestamp}}"
  }]
}
  • 他のイメージを元に作成したい場合には、 builders/source_ami_filter/filters/ の各項目に、 AWS マネジメントコンソール -> AMI からイメージを検索したときに出てくる情報を入れればよいらしい。
  • 別リージョンに作成したい場合は、builders/regionここ のどれかにすればよいらしい。

変数ファイルの作成

キー類をハードコードするのが嫌だったのでやり方を探したら、 別 JSON に記載する方法 があったのでそれを採用することにした。

AWS_ACCESS_KEY, AWS_SECRET_KEY はそれぞれ、ユーザーの作成 で確認した アクセスキー IDシークレットアクセスキー を設定する。

{
  "aws_access_key": "AWS_ACCESS_KEY",
  "aws_secret_key": "AWS_SECRET_KEY"
}

作ったファイルの検証

hashicorp/Packe のイメージを起動。

docker run -v "\PATH\TO\WORK_DIR:/work" --workdir "/work" --entrypoint='' -it --rm hashicorp/packer:1.3.1 /bin/bash

コンテナ内で次のコマンドを実行する。

packer validate -var-file=./variables.json getting_start.json

成功なら Template validated successfully. と表示される。

イメージのビルド

引き続き、コンテナ内で次のコマンドを実行する。

packer build -var-file=./variables.json getting_start.json

最終的に下記のような成功ログが表示されるはず。 数分かかった。

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-0acbfa688dc2e0b4b
  1. Packer Builder というインスタンスを作る
  2. source_ami_filter の条件に引っかかったものを取得・展開
  3. 「2.」でとってきたものをイメージ化

みたいなことをしているっぽい。

完成したイメージは、 AWS マネジメントコンソール -> サービス -> EC2 -> AMI で確認できる。

動作確認

作成したイメージからインスタンス作成ができることを確認する。

インスタンス作成

  1. AWS マネジメントコンソール -> サービス -> EC2 -> インスタンス
  2. インスタンスの作成
    1. マイ AMI -> 今回作った AMI を選択
    2. t2.small を選択 -> 確認と作成
    3. 作成
    4. キーペアの作成
      1. 新しいキーペアの作成を選択
        • キーペア名: mikoto2000
      2. キーペアのダウンロード
        • ~/.ssh/mikoto2000.pem に保存
    5. インスタンスの作成

数分待つと、 AWS マネジメントコンソール -> サービス -> EC2 -> インスタンス に今作ったインスタンスが作成され、ステータスチェックがパスしていることが確認できる。

SSH 接続

インスタンス情報の パブリック DNS (IPv4) のアドレスに、 Tera Term Pro で接続する。

  1. User name: ubuntu
  2. Use RSA/DSA/ECDSA/ED25519 key to log in を選択し、鍵に ~/.ssh/mikoto2000.pem を指定

はい。

このあと、イメージのカスタマイズが必要であれば provisioners でがちゃがちゃする感じなのかな?

後片付け

これまでの手順で、インスタンス・AMI・スナップショットが作成されているので、それぞれ削除すること。 削除しないと課金されるはず。

それぞれは次の場所で削除可能。

  • インスタンス : AWS マネジメントコンソール -> サービス -> EC2 -> インスタンス
  • AMI : AWS マネジメントコンソール -> サービス -> EC2 -> AMI
  • スナップショット : AWS マネジメントコンソール -> サービス -> EC2 -> スナップショット

以上。

参考資料

0 件のコメント:

コメントを投稿