[小ネタ] aws:SourceOrgID のおかげでSSMインベントリデータのS3集約が楽ちんになっていた

[小ネタ] aws:SourceOrgID のおかげでSSMインベントリデータのS3集約が楽ちんになっていた

Clock Icon2023.12.14

2023-11-17 に Organizations環境のリソースアクセス制御を簡素にする IAMグルーバル条件キーが追加されました。

aws:SourceOrgID を使うことで、 「SSMインベントリデータのS3バケット集約」 を楽ちんにできます 。 ちなみに、過去ブログではLambda-backed カスタムリソース作っていました。

過去ブログとの差分メインで解説していきます。

セットアップ全体像と更新点

セットアップ全体の流れは過去ブログと変わりません。

img

以下太字部分が差分です。

  1. 集約アカウントにS3バケットを作成する → バケットポリシーが変わります
  2. 「インベントリ収集」設定をメンバーアカウント群へ展開する
  3. 組織ベースの リソースデータ同期」設定をメンバーアカウント群へ展開する → 展開するCloudFormationテンプレートが変わります
  4. (オプション) Athenaなど分析ツールを使ってS3バケットに対してクエリを行う

本ブログでは更新部分のみ紹介します。

更新部分

S3バケットポリシー

以下のようなS3バケットポリシーとします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SSMBucketPermissionsCheck",
      "Effect": "Allow",
      "Principal": {
        "Service": "ssm.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
    },
    {
      "Sid": " SSMBucketDelivery",
      "Effect": "Allow",
      "Principal": {
        "Service": "ssm.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/bucket-prefix/*/accountid=*/*"
      ],
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control",
          "aws:SourceOrgID": "organization-id"
        }
      }
    },
    {
      "Sid": " SSMBucketDeliveryTagging",
      "Effect": "Allow",
      "Principal": {
        "Service": "ssm.amazonaws.com"
      },
      "Action": "s3:PutObjectTagging",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/bucket-prefix/*/accountid=*/*"
      ]
    }
  ]
}
  • DOC-EXAMPLE-BUCKET … 作成したバケット名に置換します
  • bucket-prefix/ … 好みのバケットプレフィクスに置換します (オプション)
  • organization-id … AWS Organizationsの組織IDに置換します

ハイライト部分、 "aws:SourceOrgID": "organization-id" が更新点です。 新しい条件キーを使っています。

リソースデータ同期

以下のようなCFnテンプレートを作成しました。

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  BucketName:
    Type: String
  BucketPrefix:
    Type: String
    Default: default
  SyncName:
    Type: String
    Default: org-sync

Resources:
  SSMResourceDataSync:
    Type: AWS::SSM::ResourceDataSync
    Properties:
      SyncName: !Ref SyncName
      SyncType: "SyncToDestination"
      S3Destination: 
        BucketName: !Ref BucketName
        BucketPrefix: !Ref BucketPrefix
        BucketRegion: "ap-northeast-1"
        SyncFormat: "JsonSerDe"

過去ブログでは「組織ベースのリソースデータ同期」を作っていましたが、 今回は「普通のリソースデータ同期」です。

差分はこんな感じです。 Lambda-backed カスタムリソースを作らなくて良くなった分、簡素になってますね。

img

これをCFn StackSetsとして展開します。

確認

過去ブログと確認内容は同じです。

問題なくマネージドインスタンスの構成情報を取得できていました。

img

おわりに

元はと言えば 「組織ベースのリソースデータ同期」がCloudFormationリソースでは対応していない ことが全ての元凶でしたが、 新しい条件キー(aws:SourceOrgID)のおかげで 「普通のリソースデータ同期」で集約できるようになりました。

機能として提供されている「組織ベースのリソースデータ同期」を使わないのは 少しモヤモヤしますが、 現時点(2023/12/14)では本ブログ記載の方法が一番楽ちんだと思います。

以上、参考になれば幸いです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.