AWS Organizations とAWS CloudFormation StackSets の連携が強化された

つい先日、CFn StackSets を利用してOrganizations の特定OU 配下のアカウントのすべてのリージョンに自動的にAWS Config の設定をするといった内容を投稿しましたが、さらにこのようなOrganizations とStackSets を連携した構成を簡単に実現できる機能が提供されました。

New: Use AWS CloudFormation StackSets for Multiple Accounts in an AWS Organization | Amazon Web Services

先日の投稿は以下です。

具体的に何が嬉しくなったかというと、上記の記事の中の”CFn StackSets の事前準備” が要らなくなりました。以前は、IAM ロールを管理アカウントと、ターゲットアカウントに自前で用意しなければならなかったのが、Organizations のアカントには自動でロールが適用されるようになります。

以下参考までにCFn StackSets の画面ですが、”サービスマネージドアクセス許可” という選択肢が増えており、こちらを選択するとIAM ロールの指定をする必要がなくなります。

もう一つは、予め、Organizations 全体もしくは、特定のOU にStackSets を適用しておくと、そのOrganizations もしくはOU 配下にアカウントが追加されたら自動的にStack が生成される、もしくはアカウントがOrganizations やOU から離脱したときに、自動でStack が削除されるといった設定ができるようになりました。

これで、アカウントを追加するたびに、Organizations の create-stack-instances を実行してStack を作成するといった手間を省くことができますし、うっかり必要な事前背一定をし忘れてしまうということもなくなります。

CloudForamtion APIでは以下のパラメータが追加されているようです。

create-stack-set — AWS CLI 1.18.156 Command Reference

–permission-model (string)

–auto-deployment (structure)

create-stack-instances — AWS CLI 1.18.156 Command Reference

–deployment-targets (structure)

前回投稿したCLI の内容は以下のようになります。

# Crete stack set
aws cloudformation create-stack-set --stack-set-name $STACK_SET_NAME \
    --template-body file://$TEMPLATE_FILE \
    --parameters ParameterKey=AuditS3BucketName,ParameterValue=$CONFIG_BUCKET_NAME ParameterKey=OrganizationId,ParameterValue=$ORGANIZATION_ID \
    --permission-model SERVICE_MANAGED \
    --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true
    --region $OPERATION_REGION_ID

regions="ap-south-1 eu-west-3 eu-west-2 eu-west-1 ap-northeast-2 ap-northeast-1 sa-east-1 ca-central-1 ap-southeast-1 ap-southeast-2 eu-central-1 us-east-1 us-east-2 us-west-1 us-west-2"

# Crete Stack Instances
operationid=$(aws cloudformation create-stack-instances \
    --stack-set-name $STACK_SET_NAME \
    --deployment-targets OrganizationalUnitIds=$OU_ID \
    --regions $regions \
    --operation-preferences MaxConcurrentCount=10 \
    --region $OPERATION_REGION_ID \
    --query "OperationId" \
    --output text)