Service Catalogのチュートリアル

Service Catalogのチュートリアルをやってみたメモ。

チュートリアル

以下の手順どおりに実施。

ステップ 1: AWS CloudFormation テンプレートのダウンロード

テンプレートを以下からダウンロードする。

見やすいようにYAMLに変えると以下の内容。EC2インスタンスを一つ立ち上げるテンプレート。

AWSTemplateFormatVersion: '2010-09-09'
Description: AWS Service Catalog sample template. Creates an Amazon EC2 instance running
  the Amazon Linux AMI. The AMI is chosen based on the region in which the stack is
  run. This example creates an EC2 security group for the instance to give you SSH
  access. **WARNING** This template creates an Amazon EC2 instance. You will be billed
  for the AWS resources used if you create a stack from this 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
      - t2.medium
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
  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
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
    ConstraintDescription: Must be a valid IP CIDR range of the form x.x.x.x/x.
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:
    us-east-1:
      HVM64: ami-08842d60
    us-west-2:
      HVM64: ami-8786c6b7
    us-west-1:
      HVM64: ami-cfa8a18a
    eu-west-1:
      HVM64: ami-748e2903
    ap-southeast-1:
      HVM64: ami-d6e1c584
    ap-northeast-1:
      HVM64: ami-35072834
    ap-southeast-2:
      HVM64: ami-fd4724c7
    sa-east-1:
      HVM64: ami-956cc688
    cn-north-1:
      HVM64: ami-ac57c595
    eu-central-1:
      HVM64: ami-b43503a9
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType:
        Ref: InstanceType
      SecurityGroups:
        - Ref: InstanceSecurityGroup
      KeyName:
        Ref: KeyName
      ImageId:
        Fn::FindInMap:
          - AWSRegionArch2AMI
          - Ref: AWS::Region
          - HVM64
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp:
            Ref: SSHLocation
Outputs:
  PublicDNSName:
    Description: Public DNS name of the new EC2 instance
    Value:
      Fn::GetAtt:
        - EC2Instance
        - PublicDnsName
  PublicIPAddress:
    Description: Public IP address of the new EC2 instance
    Value:
      Fn::GetAtt:
        - EC2Instance
        - PublicIp

ステップ 2: キーペアを作成する

キーペアは既にある物を使う。

ステップ 3: AWS Service Catalog のポートフォリオを作成する

Service Catalogコンソールでポートフォリオを作成する。

項目 備考
ポートフォリオ Engineering Tools
説明 Sample portfolio that contains a single product.
所有者 IT (it@example.com)

ステップ 4: AWS Service Catalog 製品を作成する

ポートフォリオの詳細ページから「新しい製品のアップロード」する。CloudFormationテンプレートをアップロードするか、URLを指定する。

項目 備考
製品名 Linux Desktop
説明 Cloud development environment configured for engineering staff. Runs AWS Linux.
所有者 IT
ディストリビューター
方法の選択 CloudFormationテンプレートの使用
CloudFormationテンプレートの使用 https://awsdocs.s3.amazonaws.com/servicecatalog/development-environment.template
バージョンタイトル v1.0
ガイダンス なし
説明 Base Version
連絡先Eメール ITSupport@example.com
サポートリンク https://wiki.example.com/IT/support
サポートの説明 Contact the IT department for issues deploying or connecting to this product.

ステップ 5: テンプレート制約を追加してインスタンスサイズを制限する

ポートフォリオの詳細ページの「制約」タブから「制約を作成」する。テンプレート制約によって、テンプレートのパラメータにさらに制約を加えることができる。制約のルールはインタラクティブエディタか、テキストで入力する。

項目 備考
製品 Linux Desktop
制約タイプ テンプレート
メソッド テキストエディタ
制約の説明 Small instance sizes
{
  "Rules": {
    "Rule1": {
      "Assertions": [
        {
          "Assert" : {"Fn::Contains": [["t2.micro", "t2.small"], {"Ref": "InstanceType"}]},
          "AssertDescription": "Instance type should be t2.micro or t2.small"
        }
      ]
    }
  }
}

ステップ 6: IAM ロールを割り当てる起動制約を追加する

起動制約を使うと、CloudFormationを実行するIAMロールを指定することができる。

まずIAMコンソールで以下のIAMポリシーをlinuxDesktopPolicyという名前で作成する。

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

続いて作成したIAMポリシーをアタッチしたIAMロールをlinuxDesktopLaunchRoleという名前で作成する。ユースケースはService Catalogを選択する。

ポートフォリオの詳細ページから、「制約を作成」する。

項目 備考
製品 Linux Desktop
制約タイプ 起動
メソッド IAMロールを検索
IAMロールのリスト linuxDesktopLaunchRole

ステップ 7: ポートフォリオへのアクセス権限のエンドユーザーへの付与

テスト用にロールを作る。自アカウントからスイッチロール可能なtestServiceCatalogUserRoleを作成し、AWSServiceCatalogEndUserFullAccessのポリシーをアタッチする。

ポートフォリオの詳細ページで「グループ、ロール、およびユーザー」タブから、「グループ、ロール、またはユーザーの追加」を行う。testServiceCatalogUserRoleをチェックして「アクセス権を追加」する。

ステップ 8: エンドユーザーのエクスペリエンスをテストする

testServiceCatalogUserRoleにスイッチロールして、Service Catalogコンソールを開く。

f:id:sotoiwa:20200407110847p:plain

このロールに許可された製品が確認できた。

製品を起動する。

項目 備考
名前 Linux-Desktop
バージョン v1.0
Server size t2.micro
Key pair <作成済みのキーペア>
CIDR 0.0.0.0/0

しばらくすると起動が完了。

f:id:sotoiwa:20200407110902p:plain

別のAWSアカウントへの共有

共有する側

このポートフォリオを別のAWSアカウントにも共有してみる。

ポートフォリオの詳細ページの「共有タブ」から、「新しいアカウントとの共有」を行う。

f:id:sotoiwa:20200407114217p:plain

Organizationのマスターアカウントの場合は組織のノードを指定して共有ができるようだ。

f:id:sotoiwa:20200407114236p:plain

今回はマスターアカウントではないのでアカウントIDを指定して共有する。

f:id:sotoiwa:20200407114253p:plain

共有される側ではポートフォリオIDが必要になるのでメモしておく。

共有された側

共有された側は、ポートフォリオのインポートが必要。ポートフォリオの「インポートした」タブから、「アクション」の「ポートフォリオをインポート」する。

f:id:sotoiwa:20200407114449p:plain

ここではポートフォリオIDを指定する。

f:id:sotoiwa:20200407114501p:plain

インポートしただけだと使えない。

インポートしたポートフォリオに「グループ、ロール、またはユーザーの」追加を行うことができるが、起動制約が設定されている場合は、設定されているIAMロールが共有元のIAMロールなので問題がある。起動すると共有元の方にスタックが作られてしまう。なので、共有目的の場合は共有する側のポートフォリオでは起動制約は設定しない方がよいと思われる。起動制約がない場合は、サービスカタログの利用者の権限でCloudFormationが実行される。

起動制約を上書きしたい場合は、共有された側でもポートフォリオを作り、インポートしたポートフォリオ内の製品をローカルのポートフォリオに追加する必要がある。

まず、共有された側のAWSアカウントに別のポートフォリオを作成する。

項目 備考
ポートフォリオ Engineering Tools
説明 Sample portfolio that contains a single product.
所有者 Development

インポートしたポートフォリオ内の製品ページを開き、「アクション」から「ポートフォリオへの製品の追加」を実行する。

ローカルのポートフォリオを選択して製品を追加する。ローカルのポートフォリオができたので、起動制約やテンプレート制約が追加できる。また、このローカルのポートフォリオが参照しているのは共有元の製品なので、共有元の製品の更新に追従できる。

共有されたアカウントでも、共有元と同様にlinuxDesktopPolicyポリシーとlinuxDesktopLaunchRoleロールを作成する。

ローカルのポートフォリオでも、共有元と同様にテンプレート制約と起動制約を作成する。この場合、起動制約は上書き、テンプレート制約は追加になる。

まとめると、起動制約を設定する場合、共有される側では以下が必要。

  1. ポートフォリオをインポート
  2. ポートフォリオをローカルに別途作成
  3. ローカルのポートフォリオにインポートしたポートフォリオ内の製品を追加
  4. ローカルのポートフォリオに起動制約を追加(上書きしたい場合)
  5. ローカルのポートフォリオにテンプレート制約を追加(追加したい場合)
  6. ローカルのポートフォリオにIAMユーザー等の許可を追加