AWSにおいてセルフサービスポータルを構築することができるAWS Service Catalogにセルフサービスアクション機能が追加されたので試したメモ。プロビジョンした製品(プロダクト)への操作(E2インスタンスの起動、停止など)をEC2のコンソールを操作することなくService Catalogのポータルから実施することができます。
前提条件
- 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 ${PRODUCT_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"をクリックする。
- "アクションの実行"をクリックする。
- セルフサービスアクションが実行され、成否が表示さす。
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 ${PRODUCT_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 ${PRODUCT_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例
出力なし
以上