AWS Service Catalogに関するメモ

AWS Service Catalog について調べたので、その時のメモ書きです。Blackbeltはこちら。

AWS Black Belt - AWS Service Catalog

Service Catalogとは

公式サイトで謳われていること。

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

なんのこっちゃなので、 Getting Started を試してみます。

概念図

とりあえずの概念図。

f:id:goodbyegangster:20190708185521p:plain

portfolioの作成

portfolioを作成します。1件につき、$5/月かかるので注意。

> aws servicecatalog create-portfolio ^
--display-name "sample" ^
--description "sample portfolio" ^
--provider-name "admin" ^
--tags "Key=Env,Value=Dev"

AWS service catalog - create-portfolio

Productの作成

CloudFormationのテンプレートを利用して、監視したいAWSリソースを定義してあげます。サンプル用のCloudFormationテンプレートは、こちらで公開されています。

サンプルテンプレート

サンプルを若干変更しつつYAML形式に変更して、以下のようなテンプレートを作成しています。

AWSTemplateFormatVersion: "2010-09-09"
Description: "AWS Service Catalog sample template."

Parameters:
  KeyName:
    Description: "Name of an existing EC2 key pair for SSH access to the EC2 instance."
    Type: "AWS::EC2::KeyPair::KeyName"
  InstanceType:
    Description: "EC2 instance type."
    Type: String
    Default: "t2.micro"
    AllowedValues:
      - "t2.micro"
      - "t2.small"
      - "m3.medium"
      - "m3.large"
  SSHLocation:
    Description: "The IP address range that can SSH to the EC2 instance."
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: "0.0.0.0/0"

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: "Instance configuration"
        Parameters:
          - InstanceType
      - Label:
          default: "Security configuration"
        Parameters:
          - KeyName
          - SSHLocation
    ParameterLabels:
      InstanceType:
        default: "Server size:"
      KeyName:
        default: "Key pair:"
      SSHLocation:
        default: "CIDR range:"

Mappings:
  AWSRegionArch2AMI:
    "ap-northeast-1":
      HVM64: "ami-35072834"

Resources:
  EC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: !Ref InstanceType
      SecurityGroups:
        - !Ref InstanceSecurityGroup
      KeyName: !Ref KeyName
      ImageId: !FindInMap
        - AWSRegionArch2AMI
        - !Ref "AWS::Region"
        - HVM64
      Tags:
        - Key: Env
          Value: Dev
  InstanceSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Enable SSH access via port 22"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
      Tags:
        - Key: Env
          Value: Dev

Outputs:
  PublicDNSName:
    Description: "Public DNS name of the new EC2 instance"
    Value: !GetAtt EC2Instance.PublicDnsName
  PublicIPAddress:
    Description: "Public IP address of the new EC2 instance"
    Value: !GetAtt EC2Instance.PublicIp

Service Catalogのコンソールから、ぽちぽち作成しています。

f:id:goodbyegangster:20190708185757p:plain

f:id:goodbyegangster:20190708185913p:plain

f:id:goodbyegangster:20190708185924p:plain

暫くすると、Productが作成されるので、 Add product to portfolio より作成したProductをPortfolioに追加してあげます。

Constraintsの作成

テンプレート用

上記のCloudFormationテンプレートから、m3系のEC2インスタンスでは起動できないよう、起動可能EC2インスタンスを制限するConstraintsを作成します。PortfolioのConstraintsセクションに移動して、 ADD CONSTRAINTS をクリックします。

f:id:goodbyegangster:20190708190026p:plain

f:id:goodbyegangster:20190708190037p:plain

制約ルールとするテンプレートは、公式に記載されていたものを利用しています。ここはjsonで書かないとだめみたいです。

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

Step 5: Add a Template Constraint to Limit Instance Size

テンプレートの書き方はこちら。assert構文を作っているイメージでしょうか。

テンプレート制約のルール

launch用

ServiceCatalogを操作する利用者のIAMポリシーと、ServiceCatalogによりAWSリソースが作成されるIAMポリシーを、分離することができます。

まず、ServiceCatalogで利用するIAMロールを作成します。以下のIAMポリシーと、 AmazonEC2FullAccess ポリシーを持ったServiceCatalog用ロールを作成してあげます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "catalog-user:*",
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:GetTemplateSummary",
                "cloudformation:SetStackPolicy",
                "cloudformation:ValidateTemplate",
                "cloudformation:UpdateStack",
                "s3:GetObject"
            ],
            "Resource": "*"
        }
    ]
}

https://docs.aws.amazon.com/ja_jp/servicecatalog/latest/adminguide/constraints-launch.html#constraints-launch-role

続いて、テンプレートの時と同様に、PortfolioのConstraintsセクションに移動して、 ADD CONSTRAINTS をクリックします。

f:id:goodbyegangster:20190708190052p:plain

f:id:goodbyegangster:20190708190104p:plain

TagOptionの設定

TagOption とは、作成するAWSリソースに一括でタグを設定できる機能となります。基本的に画面を見れば作成できるので、ぽちぽち作成していきます。

TagOptions の管理

作成したTagOptionを、portfolio内に配置したproductに対して、TagOptionsのセクションで ADD TAGOPTION をクリックして追加してあげます。

portfolioアクセス権をIAMユーザに付与

portfolioの Users, groups and roles セクションにて、アクセス可能としたいIAMユーザなりグループを追加します。なお、該当IAMユーザには、最低限以下のIAMポリシーを付与しておく必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "servicecatalog:ProvisionProduct",
                "servicecatalog:CreateProvisioningArtifact",
                "servicecatalog:UpdateProvisionedProduct",
                "servicecatalog:UpdateProvisioningArtifact",
                "servicecatalog:TerminateProvisionedProduct"
            ],
            "Resource": "*"
        }
    ]
}

Service CatalogによるAWSリソースの作成

上記のIAMユーザでAWSコンソールにログイン、Service Catalogのページより、今回作成したProductを作成/更新/削除できるようなっています。