OpsWorks を触ってみた

Study

概要

AWS 資格の勉強に出てきた OpsWorks Stacks に触れてみた話。

経緯

OpsWorks は AWS の資格試験で登場するが、全く触れたことがなかったので、サービス概要を掴みきれていなかった。
知識としては、スタックとレイヤという要素で構成されているということくらいしか理解していない

たまたま OpsWorks を触りそうなタイミングがあったので、ひとまず AWS のチュートリアルをやってみた。

OpsWorks について

OpsWorks とは、サーバにインストールするミドルウェアやアプリケーションを構築・管理するサービスである。

設定・構築には、Puppet あるいは Chef というツールを使用している。Puppet や Chef についてはあまり詳しく知らないが、元々オンプレミスサーバを構築する際に用いられていたツールらしい。
オンプレミスサーバを AWS に移行する場合、Chef のノウハウを持っていれば、OpsWorks を使用すると比較的容易に移行できる。

内容

AWS の公式資料の OpsWorks Stacks の Linux サーバ版をやることにした。

Linux スタックの使用開始 - AWS OpsWorks
このウォークスルーでは、AWS スタックで Node.js アプリケーション環境を作成する方法を示します。OpsWorks

まずはスタックを作成する。

OpsWorks の画面に移動し、「Add your first stack」をクリック。

「Chef 12 stack」を選択し、資料に倣って値を設定する。リポジトリの URL は https://s3.amazonaws.com/opsworks-demo-assets/opsworks-linux-demo-cookbooks-nodejs.tar.gz を設定。自分の環境では、東京リージョンに VPC とパブリックサブネットをセッティングしていたので、それを流用した。

設定後、「Advanced」をクリック。

「Advanced Options」 で、IAM ロールとインスタンスプロファイルを設定する。

  • OpsWorks 用:aws-opsworks-service-role
  • EC2 用:aws-opsworks-ec2-role

しかし自分の環境にはなかったので、以下の IAM ロールを作成した。

  • OpsWorks 用:opsworks-test-role
  • EC2 用:opsworks-test-instance-role

opsworks-test-role に割り当てたポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:DescribeAlarms",
        "cloudwatch:GetMetricStatistics",
        "ec2:*",
        "ecs:*",
        "elasticloadbalancing:*",
        "iam:GetRolePolicy",
        "iam:ListInstanceProfiles",
        "iam:ListRoles",
        "iam:ListUsers",
        "rds:*"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": "ec2.amazonaws.com"
        }
      }
    }
  ]
}

opsworks-test-instance-role に割り当てたポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:*",
                "s3:*",
                "opsworks:*",
                "iam:PassRole"
            ],
            "Resource": "arn:aws:ec2:ap-northeast-1:AccountId:instance/*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "opsworks.amazonaws.com"
                }
            }
        }
    ]
}

もう一度 OpsWorks の画面を開き直し同様の手順を踏み、IAM ロールとインスタンスプロファイルを設定し、「Add stack」をクリック。

余談だが、インスタンスプロファイルのことを EC2 インスタンス用の IAM ロールだと思っていた時期があった。実はインスタンスプロファイルと IAM ロールは別物。コンソールだけ触っていると分からんけど。

スタック作成にやたら時間がかかったり、ServiceError: Service Role Arn: arn:aws:iam::AccoundId:role/opsworks-test-role is not yet propagated, please try again in a couple of minutes. というエラーが出たりしたが、最終的には Credential has not the necessary trust relationship. というエラーが出た。OpsWorks 用の IAM ポリシーを修正するとスタックが作成できた。公式資料の最小限のポリシーを設定していたが、今回のチュートリアルには権限が足りなかったらしい。

続いて「Add layer」からレイヤを追加する。

名前を設定してレイヤを追加。

レイヤの画面に遷移する。

「Security」に移動し、セキュリティグループに「AWS-OpsWorks-WebApp」を追加する。

同様に「Network」に移動し、パブリック IP が割り当てられるように設定する。

続いてアプリケーションを追加する。

左のメニューの「App」を選択し、「Add an app」をクリック。

名前とリポジトリ URL のみ設定する。

左のメニューの「Instance」を選択し、「Add an instance」をクリック。インスタンスタイプについては、自分の環境で無料利用枠の対象となっている t2.micro を選択した。

インスタンス追加直後は停止状態になっているので、「start」をクリックして起動する。「online」状態になるまで待機。少し時間がかかる。「online」になれば次へ。

アプリケーションのデプロイを行う。

左のメニューから「Layers」を選択し、「Recipes」をクリック。

「Deploy」の欄に nodejs_demo::default と入力して、追加する。

左のメニューから「App」を選択し、「deploy」をクリック。

そのまま「Deploy」をクリック。

待っていればデプロイが完了する。

EC2 の IP アドレスにアクセス。サンプルアプリの動作を確認できた。

感想

OpsWorks はこれまで名前を知っているだけのサービスだったが、簡単な操作方法が理解できた。これから OpsWorks を触る機会があるかはさておき、なんとなく設定の流れを掴めたのではないかと思う。

一方で、OpsWorks をちゃんと理解するのであれば、Puppet や Chef がどういうものか分かっておく必要がある。

OpsWorks 関係ないけど、この記事の執筆中に少し疑問が。

この記事はどの層に向けた記事?AWS に触ったこともないような初心者が OpsWorks を触るとも思えないし、AWS 触ったことがある人に対しては説明が過剰な気がする。
しかもレイヤの作成以降は、公式資料でも画像を交えてかなり丁寧に説明されているので、そっちを参照すれば良いのでは?

無駄な労力欠けてる気がする。今度からは画像とか使うのは要点だけにしよう。

参考

AWS OpsWorks とは? - AWS OpsWorks
AWS OpsWorks について説明します。
OpsWorks のチュートリアルで IAM ロールのエラーが発生したので解決してみた
ユーザーに代わって AWS OpsWorks スタックがタスクを実行できるようにする - AWS OpsWorks
ユーザーに代わって AWS リソースを操作するアクセス許可をスタックに付与する IAM ロールを指定します。
EC2 インスタンスで実行するアプリケーションに対するアクセス許可の指定 - AWS OpsWorks
Amazon EC2 インスタンスで実行するアプリケーションのアクセス許可を付与する IAM ロールを指定します。
タイトルとURLをコピーしました