AWS Service Catalogで制御された自由を

記事タイトルとURLをコピーする

AWSの数多くあるサービスの中の1つとして、AWS Service Catalogというものがあります。 これは何に使えるのでしょうか?
モデルケースを考え、設定・利用方法を確認しました。

AWS Service Catalogとは

AWS Service Catalog では、AWS での使用が承認された IT サービスのカタログを作成および管理できます。この IT サービスには、仮想マシンイメージ、サーバー、ソフトウェア、データベースから包括的な多層アプリケーションアーキテクチャまで、あらゆるものが含まれます。AWS Service Catalog では、一般的にデプロイされた IT サービスを集中管理でき、一貫性のあるガバナンスを実現し、コンプライアンス要件を満たすと同時に、ユーザーは必要な承認済みの IT サービスのみをすばやくデプロイできます。

AWS Service Catalog

1.モデルケース

1-1.AWS Service Catalog導入前

開発チームのうさぎさん、ねこさん、くまさんはEC2インスタンスを欲しがっています。
IT管理者は3人から依頼を受け、開発用サブネットにEC2インスタンスを構築します。

IT管理者は思いました。
「毎回同じことをするのは大変だな。利用者自身でやってもらいたいな。」

開発者達も思いました。
「クラウドなのに時間かかるんだな。自分でやれば早くできそうなのに。」

1-2.クラウドなのに遅い。なぜ?

多くのAWSユーザーは意図的に権限が制限されます。
主な理由は、セキュリティ(適当な設定をされると危険、見えてはいけないものは隠したい)、コスト(高価なサービスを使われると予算的に困る)などの場合が多いです。
しかし、全ての設定をIT管理者が行うと、開発速度を妨げることになります。

1-3.AWS Service Catalog導入後

IT管理者が事前にサービスカタログを定義しておきます。
開発者達はいつでもService Catalog画面で数クリックでEC2インスタンスを作成できます。

2.設定手順

公式ドキュメントの AWS Service Catalog > 開始方法 を参考にし、多少アレンジを加えました。

2-1.ユーザーに許可することの定義

IT管理者は下記のパラメータのEC2インスタンス作成・削除のみを開発者グループに許可します。
インスタンス起動後はSSHでログインできますが、AWSのAPI的には他に何の権限も渡しません。

パラメータ
サブネット subnet-xxxx
AMI ami-xxxx
セキュリティグループ sg-xxxx
インスタンスタイプ t3.microかt3.smallを選択できる

2-2.製品の作成

EC2インスタンス作成のためのCloudFormationテンプレートを製品として登録します。

Service Catalog > 製品 > 新しい製品のアップロード

製品の詳細

CloudFormationテンプレート

今回は下記のテンプレートを作成しました。
これは特にService Catalogでしか使えないテンプレートではなく、CloudFormationとしても普通に使えるものです。

なお、Outputが重要で、今回はここでPrivateIpを定義しています。
Service Catalogのユーザーは、EC2コンソールで情報を見れません。
Outputで定義した情報は、Service Catalogコンソールで見ることができます。

AWSTemplateFormatVersion: '2010-09-09'
Description: This CloudFormation template to create EC2 instances.

Parameters:
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Name of an existing EC2 KeyPair to enable access to instances.
  InstanceType:
    Type: String
    Default: t3.micro
    AllowedValues: ["t2.micro","t3.micro","t3.small","m5large" ]
    Description: EC2 instance type.

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
    - Label:
        default: EC2 Instance Keypair Name
      Parameters:
        - KeyName
    - Label:
        default: Instance configuration
      Parameters:
        - [ InstanceType ]

Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      ImageId: ami-xxxx
      KeyName: !Ref KeyName
      NetworkInterfaces:
        - SubnetId: subnet-xxxx
          AssociatePublicIpAddress: false
          GroupSet:
             - sg-xxxx
          DeviceIndex: 0

Outputs:
  PrivateIp:
    Value: !GetAtt Ec2Instance.PrivateIp

製品作成の完了

2-3.ポートフォリオの作成

Service Catalog > ポートフォリオ > ポートフォリオの作成

任意のパラメータを入力していきます。

ポートフォリオ作成の完了

まだ中身は空ですが、ポートフォリオが作成できました。

2-4.ポートフォリオへ製品の追加

Service Catalog > ポートフォリオ > (作成したポートフォリオ名) > 製品 > ポートフォリオへの製品の追加

先ほど作成した製品を選択し、ポートフォリオへの製品の追加を押します。

2-5.ポートフォリオへ起動制約の追加

Service Catalog > ポートフォリオ > (作成したポートフォリオ名) > 制約 > 制約を作成

制約タイプで起動を選択します。
これはService Catalogが製品を起動する時に利用する時の権限の定義となります。
エンドユーザーにEC2の作成権限など与えないので、Service Catalogに権限を与える仕様です。

IAMロールを選択します。
今回はステップ 6: IAM ロールを割り当てる起動制約を追加するに書いてあるものをそのまま利用しました。
EC2インスタンス以外の製品を作成したい場合は、権限を調整する必要があるかもしれません。

2-6.ポートフォリオへテンプレート制約の追加

Service Catalog > ポートフォリオ > (作成したポートフォリオ名) > 制約 > 制約を作成

制約タイプでテンプレートを選択します。
CloudFormationテンプレートの中でパラメータとして選択できる項目がありましたが、そこに制約をかけます。

テンプレート制約ビルダー > 制約テキストエディター

InstanceTypeでt3.micro、またはt3.smallを選択できるようにしました。

{
  "Rules": {
    "Rule1": {
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              [
                "t3.micro",
                "t3.small"
              ],
              {
                "Ref": "InstanceType"
              }
            ]
          },
          "AssertDescription": "Instance type should be t3.micro or t3.small"
        }
      ]
    }
  }
}

2-7.ポートフォリオへグループの追加

Service Catalog > ポートフォリオ > (作成したポートフォリオ名) > グループ、ロール、およびユーザー > グループ、ロール、またはユーザーの追加

ユーザーの所属するIAMグループ(ここではDeveloper)を追加します。

2-8.IAMグループへAWSServiceCatalogEndUserFullAccessポリシーを追加

IAMグループへはAWSServiceCatalogEndUserFullAccessポリシーだけ与えます。 このポリシーの中身を見ると、ほぼService Catalogと、Service Catalogに関連するCloudFormationの権限のみとなっています。

これで利用する準備は完了しました。

3.Service Catalogの利用

ここからは、エンドユーザー用のIAMユーザーで操作します。

3-1.製品の起動

Service Catalog > 製品リスト > (作成した製品)

製品の起動

製品バージョン

管理者側でCloudFormationテンプレートを修正したりすると、バージョンが増えていきます。
ここでは最新版を選びました。

パラメータ

今回はInstanceTypeにパラメータ制約をしたので、t3.microかt3.smallしか選択できません。

TagOption

ここでタグをつけると、EC2インスタンスにも反映されます。

通知

今回は選択しませんでした。

確認

完了

作成できると、以下のような画面になります。 CloudFormationテンプレートのOutputで定義したPrivateIpが確認できます。 IPアドレスがわかれば、ユーザーはSSHログインできますね。

3-2.製品の削除

不要になったら、ユーザー側で削除できます。

3-3.EC2コンソールでのリソースの見え方

管理者側

普通のEC2インスタンスとして、表示されます。

ユーザー側

EC2に権限が全く無いため、表示されません。

まとめ

AWS Service Catalogを使えば、管理者のコントロールしたAWSリソースの作成をユーザーに許可できます。
最初にCloudFormationテンプレートを作成するのは少し大変ですが、ユーザーからのリソース作成・削除の依頼が多い環境では検討する価値はあるかと思います。

渡辺 信秀 (記事一覧)