AWS Service Catalogにセルフサービスアクションを設定する

AWS Service Catalogにセルフサービスアクションを設定する:

AWSにおいてセルフサービスポータルを構築することができるAWS Service Catalogにセルフサービスアクション機能が追加されたので試したメモ。プロビジョンした製品(プロダクト)への操作(E2インスタンスの起動、停止など)をEC2のコンソールを操作することなくService Catalogのポータルから実施することができます。

https://docs.aws.amazon.com/servicecatalog/latest/adminguide/using-service-actions.html


前提条件

  • Service Catalogにポートフォリオと製品がすでに登録されている。
  • AWS CLIがインストールされており、クレデンシャルが設定されている。
  • JSONファイル検証用にjsonlintがインストールされている。


EC2インスタンス停止セルフサービスアクションの設定(Service Catalog管理者が実施)


セルフサービスアクション実行用IAMロールの作成


Assume Role Documentの作成

  • 作業フォルダの作成
コマンド
ls -d ${HOME}/tmp/ 
 
# 存在しない場合 
mkdir -p ${HOME}/tmp/ 
  • 変数の設定
コマンド
# Assume Role Document ディレクトリ 
DIR_IAM_ROLE_DOC="${HOME}/tmp" 
# Role名 
IAM_ROLE_NAME='sc-ec2-selfservice-action-role' 
# Principle名 
IAM_PRINCIPAL='servicecatalog.amazonaws.com' 
  • ファイル名の設定
コマンド
FILE_IAM_ROLE_DOC="${DIR_IAM_ROLE_DOC}/${IAM_ROLE_NAME}.json" \ 
  && echo ${FILE_IAM_ROLE_DOC} 
Output例
/Users/xxxxx/tmp/sc-ec2-selfservice-action-role.json 
  • Assume Role Documentの作成
コマンド
cat << EOF > ${FILE_IAM_ROLE_DOC} 
{ 
  "Version": "2012-10-17", 
  "Statement": [ 
    { 
      "Action": "sts:AssumeRole", 
      "Principal": { 
        "Service": "${IAM_PRINCIPAL}" 
      }, 
      "Effect": "Allow", 
      "Sid": "" 
    } 
  ] 
} 
EOF 
 
cat ${FILE_IAM_ROLE_DOC} 
Output例
{ 
  "Version": "2012-10-17", 
  "Statement": [ 
    { 
      "Action": "sts:AssumeRole", 
      "Principal": { 
        "Service": "servicecatalog.amazonaws.com" 
      }, 
      "Effect": "Allow", 
      "Sid": "" 
    } 
  ] 
} 
  • jsonlintでjsonファイルが壊れていないかチェックする。問題なければ何も出力されない。
コマンド
jsonlint -q ${FILE_IAM_ROLE_DOC} 


IAMロールの作成

コマンド
aws iam create-role \ 
  --role-name ${IAM_ROLE_NAME} \ 
  --assume-role-policy-document file://${FILE_IAM_ROLE_DOC} 
Output例
{ 
    "Role": { 
        "Path": "/", 
        "RoleName": "sc-ec2-selfservice-action-role", 
        "RoleId": "AROAJBFA2Y24F66YV3AZQ", 
        "Arn": "arn:aws:iam::xxxxxxxxxxxx:role/sc-ec2-selfservice-action-role", 
        "CreateDate": "2019-01-31T13:05:42Z", 
        "AssumeRolePolicyDocument": { 
            "Version": "2012-10-17", 
            "Statement": [ 
                { 
                    "Action": "sts:AssumeRole", 
                    "Principal": { 
                        "Service": "servicecatalog.amazonaws.com" 
                    }, 
                    "Effect": "Allow", 
                    "Sid": "" 
                } 
            ] 
        } 
    } 
} 


IAMポリシーのアタッチ

  • IAMポリシーARMの取得
コマンド
IAM_POLICY_NAME="AmazonSSMAutomationRole" 
IAM_POLICY_ARN=$( \ 
  aws iam list-policies \ 
    --scope AWS \ 
    --max-items 1000 \ 
    --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \ 
    --output text \ 
) \ 
  && echo "${IAM_POLICY_ARN}" 
output例
arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole 
  • ポリシーのアタッチ
コマンド
aws iam attach-role-policy \ 
  --role-name ${IAM_ROLE_NAME} \ 
  --policy-arn ${IAM_POLICY_ARN} 
Output例
出力なし 


Service Actionの作成 (EC2 Instance停止アクション)

  • IAMロールARMの取得
コマンド
IAM_ROLE_ARN=$( \ 
  aws iam get-role \ 
    --role-name ${IAM_ROLE_NAME} \ 
    --query "Role.Arn" \ 
    --output text \ 
) \ 
  && echo "${IAM_ROLE_ARN}" 
Output例
arn:aws:iam::xxxxxxxxxxxx:role/sc-ec2-selfservice-action-role 
  • 変数の設定
コマンド
# Service Action名 
SERVICE_ACTION_NAME='ec2-instance-stop' 
# Service action definition type (現時点ではSSM_AUTOMATIONのみ) 
SERVICE_ACTION_DEFINITION_TYPE='SSM_AUTOMATION' 
# Desctiption 
SERVICE_ACTION_DESCRIPTION='Stop EC2 Instance' 
# DEFINITION 
SERVICE_ACTION_DEFINITION="Name=AWS-StopEC2Instance,Version=1,AssumeRole=${IAM_ROLE_ARN},Parameters='[{\"Name\":\"InstanceId\",\"Type\":\"TARGET\"}]'" 
  • Service Actionの作成
コマンド
aws servicecatalog create-service-action \ 
    --name ${SERVICE_ACTION_NAME} \ 
    --definition-type ${SERVICE_ACTION_DEFINITION_TYPE} \ 
    --definition ${SERVICE_ACTION_DEFINITION} \ 
    --description "${SERVICE_ACTION_DESCRIPTION}" 
Output例
{ 
    "ServiceActionDetail": { 
        "ServiceActionSummary": { 
            "Id": "act-mrwnkma3yxi6s", 
            "Name": "ec2-instance-stop", 
            "Description": "Stop EC2 Instance", 
            "DefinitionType": "SSM_AUTOMATION" 
        }, 
        "Definition": { 
            "AssumeRole": "arn:aws:iam::xxxxxxxxxxxx:role/sc-ec2-selfservice-action-role", 
            "Name": "AWS-StopEC2Instance", 
            "Parameters": "[{\"Name\":\"InstanceId\",\"Type\":\"TARGET\"}]", 
            "Version": "1" 
        } 
    } 
} 


Service ActionとService Catalog製品の関連付け

  • Service Action IDの取得
コマンド
SERVICE_ACTION_ID=$( \ 
aws servicecatalog list-service-actions \ 
    --query "ServiceActionSummaries[?Name==\`${SERVICE_ACTION_NAME}\`].Id" \ 
    --output text \ 
) \ 
&& echo ${SERVICE_ACTION_ID} 
Output例
act-mrwnkma3yxi6s 
  • Product IDの取得

    • 今回はすでにService CatalogにBase Amazon LinuxというEC2インスタンス1台を起動するプロダクトが作成されている前提。
    • 自分(操作しているIAMユーザ/ロール)がその製品を登録したポートフォリオにAssociateされていない場合はsearch-productsではなくsearch-products-as-adminを使ってプロダクトを検索する。
コマンド
PRODUCT_NAME='Base Amazon Linux' 
PRODUCT_ID=$( \ 
    aws servicecatalog search-products-as-admin \ 
        --filters FullTextSearch="${PRODUCT_NAME}" \ 
        --query "ProductViewDetails[?ProductViewSummary.Name==\`${PRODUCT_NAME}\`].ProductViewSummary.ProductId" \ 
        --output text \ 
)\ 
&& echo "${PRODUCT_ID}" 
Output例
prod-eejduplwqswgk 
  • Provisioning Artifact ID(=製品に登録されているバージョンのID)の取得

    • 1.0というバージョンが登録されている前提。
    • 自分(操作しているIAMユーザ/ロール)がその製品を登録したポートフォリオにAssociateされていない場合はdescribe-productではなくdescribe-product-as-adminを使ってプロダクトを検索する。
コマンド
PRODUCT_VERSION='1.0' 
PROVISIONING_ARTIFACT_ID=$( \ 
    aws servicecatalog describe-product-as-admin \ 
        --id ${PRUDUCT_ID} \ 
        --query "ProvisioningArtifactSummaries[?Name==to_string(\`${PRODUCT_VERSION}\`)].Id" \ 
        --output text \ 
) \ 
&& echo ${PROVISIONING_ARTIFACT_ID} 
Output例
pa-uwsudknf7eowo 
  • Service ActionをProvisioning Artifactに紐付ける
コマンド
aws servicecatalog associate-service-action-with-provisioning-artifact \ 
    --product-id ${PRODUCT_ID} \ 
    --provisioning-artifact-id ${PROVISIONING_ARTIFACT_ID} \ 
    --service-action-id ${SERVICE_ACTION_ID} 
Output例
出力なし 


動作確認 (Service Catalogユーザで実施)

  • セルフサービスアクションを設定した製品を起動しておく。
  • "プロビジョニングされた製品のリスト"から起動した製品をクリックし、詳細画面を表示する。
  • 画面右上の"アクション" -> "ec2-instance-stop"をクリックする。


image.png


  • "アクションの実行"をクリックする。


    image.png
  • セルフサービスアクションが実行され、成否が表示さす。


    image.png


EC2インスタンス起動セルフサービスアクションの追加(Service Catalog管理者が実施)


Service Actionの作成 (EC2 Instance起動アクション)

  • IAMロールARMの取得
コマンド
IAM_ROLE_ARN=$( \ 
  aws iam get-role \ 
    --role-name ${IAM_ROLE_NAME} \ 
    --query "Role.Arn" \ 
    --output text \ 
) \ 
  && echo "${IAM_ROLE_ARN}" 
Output例
arn:aws:iam::xxxxxxxxxxxx:role/sc-ec2-selfservice-action-role 
  • 変数の設定
コマンド
# Service Action名 
SERVICE_ACTION_NAME='ec2-instance-start' 
# Service action definition type (現時点ではSSM_AUTOMATIONのみ) 
SERVICE_ACTION_DEFINITION_TYPE='SSM_AUTOMATION' 
# Desctiption 
SERVICE_ACTION_DESCRIPTION='Start EC2 Instance' 
# DEFINITION 
SERVICE_ACTION_DEFINITION="Name=AWS-StartEC2Instance,Version=1,AssumeRole=${IAM_ROLE_ARN},Parameters='[{\"Name\":\"InstanceId\",\"Type\":\"TARGET\"}]'" 
  • Service Actionの作成
コマンド
aws servicecatalog create-service-action \ 
    --name ${SERVICE_ACTION_NAME} \ 
    --definition-type ${SERVICE_ACTION_DEFINITION_TYPE} \ 
    --definition ${SERVICE_ACTION_DEFINITION} \ 
    --description "${SERVICE_ACTION_DESCRIPTION}" 
Output例
{ 
    "ServiceActionDetail": { 
        "ServiceActionSummary": { 
            "Id": "act-2okqvu53sxzo2", 
            "Name": "ec2-instance-start", 
            "Description": "Start EC2 Instance", 
            "DefinitionType": "SSM_AUTOMATION" 
        }, 
        "Definition": { 
            "AssumeRole": "arn:aws:iam::xxxxxxxxxxxx:role/sc-ec2-selfservice-action-role", 
            "Name": "AWS-StartEC2Instance", 
            "Parameters": "[{\"Name\":\"InstanceId\",\"Type\":\"TARGET\"}]", 
            "Version": "1" 
        } 
    } 
} 


Service ActionとService Catalog製品の関連付け

  • Service Action IDの取得
コマンド
SERVICE_ACTION_ID=$( \ 
aws servicecatalog list-service-actions \ 
    --query "ServiceActionSummaries[?Name==\`${SERVICE_ACTION_NAME}\`].Id" \ 
    --output text \ 
) \ 
&& echo ${SERVICE_ACTION_ID} 
Output例
act-2okqvu53sxzo2 
  • Product IDの取得
コマンド
PRODUCT_NAME='Base Amazon Linux' 
PRODUCT_ID=$( \ 
    aws servicecatalog search-products-as-admin \ 
        --filters FullTextSearch="${PRODUCT_NAME}" \ 
        --query "ProductViewDetails[?ProductViewSummary.Name==\`${PRODUCT_NAME}\`].ProductViewSummary.ProductId" \ 
        --output text \ 
)\ 
&& echo "${PRODUCT_ID}" 
Output例
prod-eejduplwqswgk 
  • Provisioning Artifact ID(=製品に登録されているバージョンのID)の取得
コマンド
PRODUCT_VERSION='1.0' 
PROVISIONING_ARTIFACT_ID=$( \ 
    aws servicecatalog describe-product-as-admin \ 
        --id ${PRUDUCT_ID} \ 
        --query "ProvisioningArtifactSummaries[?Name==to_string(\`${PRODUCT_VERSION}\`)].Id" \ 
        --output text \ 
) \ 
&& echo ${PROVISIONING_ARTIFACT_ID} 
Output例
pa-uwsudknf7eowo 
  • Service ActionをProvisioning Artifactに紐付ける
コマンド
aws servicecatalog associate-service-action-with-provisioning-artifact \ 
    --product-id ${PRODUCT_ID} \ 
    --provisioning-artifact-id ${PROVISIONING_ARTIFACT_ID} \ 
    --service-action-id ${SERVICE_ACTION_ID} 
Output例
出力なし 


EC2インスタンス再起動セルフサービスアクションの追加(Service Catalog管理者が実施)


Service Actionの作成 (EC2 Instanc再起動アクション)

  • IAMロールARMの取得
コマンド
IAM_ROLE_ARN=$( \ 
  aws iam get-role \ 
    --role-name ${IAM_ROLE_NAME} \ 
    --query "Role.Arn" \ 
    --output text \ 
) \ 
  && echo "${IAM_ROLE_ARN}" 
Output例
arn:aws:iam::xxxxxxxxxxxx:role/sc-ec2-selfservice-action-role 
  • 変数の設定
コマンド
# Service Action名 
SERVICE_ACTION_NAME='ec2-instance-restart' 
# Service action definition type (現時点ではSSM_AUTOMATIONのみ) 
SERVICE_ACTION_DEFINITION_TYPE='SSM_AUTOMATION' 
# Desctiption 
SERVICE_ACTION_DESCRIPTION='Restart EC2 Instance' 
# DEFINITION 
SERVICE_ACTION_DEFINITION="Name=AWS-RestartEC2Instance,Version=1,AssumeRole=${IAM_ROLE_ARN},Parameters='[{\"Name\":\"InstanceId\",\"Type\":\"TARGET\"}]'" 
  • Service Actionの作成
コマンド
aws servicecatalog create-service-action \ 
    --name ${SERVICE_ACTION_NAME} \ 
    --definition-type ${SERVICE_ACTION_DEFINITION_TYPE} \ 
    --definition ${SERVICE_ACTION_DEFINITION} \ 
    --description "${SERVICE_ACTION_DESCRIPTION}" 
Output例
{ 
    "ServiceActionDetail": { 
        "ServiceActionSummary": { 
            "Id": "act-sxovcxrrds3nu", 
            "Name": "ec2-instance-restart", 
            "Description": "Restart EC2 Instance", 
            "DefinitionType": "SSM_AUTOMATION" 
        }, 
        "Definition": { 
            "AssumeRole": "arn:aws:iam::xxxxxxxxxxxx:role/sc-ec2-selfservice-action-role", 
            "Name": "AWS-RestartEC2Instance", 
            "Parameters": "[{\"Name\":\"InstanceId\",\"Type\":\"TARGET\"}]", 
            "Version": "1" 
        } 
    } 
} 


Service ActionとService Catalog製品の関連付け

  • Service Action IDの取得
コマンド
SERVICE_ACTION_ID=$( \ 
aws servicecatalog list-service-actions \ 
    --query "ServiceActionSummaries[?Name==\`${SERVICE_ACTION_NAME}\`].Id" \ 
    --output text \ 
) \ 
&& echo ${SERVICE_ACTION_ID} 
Output例
act-sxovcxrrds3nu 
  • Product IDの取得
コマンド
PRODUCT_NAME='Base Amazon Linux' 
PRODUCT_ID=$( \ 
    aws servicecatalog search-products-as-admin \ 
        --filters FullTextSearch="${PRODUCT_NAME}" \ 
        --query "ProductViewDetails[?ProductViewSummary.Name==\`${PRODUCT_NAME}\`].ProductViewSummary.ProductId" \ 
        --output text \ 
)\ 
&& echo "${PRODUCT_ID}" 
Output例
prod-eejduplwqswgk 
  • Provisioning Artifact ID(=製品に登録されているバージョンのID)の取得
コマンド
PRODUCT_VERSION='1.0' 
PROVISIONING_ARTIFACT_ID=$( \ 
    aws servicecatalog describe-product-as-admin \ 
        --id ${PRUDUCT_ID} \ 
        --query "ProvisioningArtifactSummaries[?Name==to_string(\`${PRODUCT_VERSION}\`)].Id" \ 
        --output text \ 
) \ 
&& echo ${PROVISIONING_ARTIFACT_ID} 
Output例
pa-uwsudknf7eowo 
  • Service ActionをProvisioning Artifactに紐付ける
コマンド
aws servicecatalog associate-service-action-with-provisioning-artifact \ 
    --product-id ${PRODUCT_ID} \ 
    --provisioning-artifact-id ${PROVISIONING_ARTIFACT_ID} \ 
    --service-action-id ${SERVICE_ACTION_ID} 
Output例
出力なし 
以上

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)