[アップデート] SSMパラメータストアがRAMを使用してクロスアカウントで共有できるようになっていたので試してみる

2024.02.23

こんにちは、AWS事業本部の平木です!

AWS Systems Manager(SSM)パラメータストアのコンソール画面を見たところ、
「クロスアカウントパラメータ共有の紹介」と、アップデートが紹介されていました。

今まではPutResourcePolicy APIを活用して行う方法があったようですが、
今回のアップデートでより楽にパラメータを共有できるようになったので試してみました。

前提

共有先のアカウントからパラメータを利用する際は、AWS CLIまたはAWS SDKで利用します。
AWS CLIを最新のバージョンに引き上げておく必要があります。

構成

今回はせっかくなので少し工夫が必要なSecureStringのパラメータをKMSキーで暗号化し、
AWS Resource Access Manager(RAM)を使用し、Organizations内のメンバーアカウントから参照できるように設定してみます。

アカウントA: SSMパラメータストア共有元、KMSキー保有アカウント
アカウントB: SSMパラメータストア共有先のOrganizationsメンバーアカウント

として扱います。

やってみた

KMSキーの作成

今回はSSMパラメータストアの中でもSecureStringのパラメータを共有します。
SecureStringのパラメータをクロスアカウントに共有する場合は、AWSマネージドキーではなくKMSキーによる暗号化が必要となります。

そのためまずKMSキーを作成します。

下記キーポリシーを使用した任意のKMSキーを作成します。
最後のSid:Allow use of the KMS key for organizatiosのセグメントを後から追加してください。

{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<アカウントAのID>:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<キー管理者のARN>"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the KMS key for organization",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "kms:Decrypt",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "<OrganizationsのOU ID>"
                }
            }
        }
    ]
}

KMSキーポリシーでOrganizations内の全てのアカウントが使用の許可を与えるには、aws:PrincipalOrgIDグローバル条件キーを使用します。

すべての AWS 組織アカウントで AWS KMS キーの使用を許可する | AWS re:Post

パラメータの作成

KMSキーの準備はできたため、パラメータを作成します。

クロスアカウントの共有を行う場合は、パラメータの階層をアドバンストでパラメータを作成する必要があります。
アドバンストパラメータは課金が発生しますのでご注意ください。

以下のようなコマンドで作成します。

aws ssm put-parameter \
  --region ap-northeast-1 \
  --name "<パラメータの名前>" \
  --value "<パラメータの値>" \
  --type SecureString \
  --tier Advanced \
  --key-id "<事前に作成したKMSキーID>"

リソース共有の作成

続いて作成したパラメータを共有するために、RAMのリソース共有を作成します。

Organizations全体に共有する場合は、下記のようなコマンドで作成します。

aws ram create-resource-share \
  --region ap-northeast-1 \
  --name "<リソース共有の名前>" \
  --resource-arns "<共有するパラメータのARN>" \
  --principals "<共有するOUのARN>"

指定するプリンシパルの記載方法は下記AWS CLIのリファレンスを参照ください。

create-resource-share — AWS CLI 1.32.48 Command Reference

クロスアカウントでパラメータを使用する

まずメンバーアカウント側からどのパラメータが共有されているか確認するには下記コマンドで確認できます。

aws ssm describe-parameters --shared

実行すると下記のようにパラメータ一覧が表示されます。

[cloudshell-user@ip-10-134-25-99 ~]$ aws ssm describe-parameters --shared
{
    "Parameters": [
        {
            "Name": "cross-account-param",
            "ARN": "arn:aws:ssm:ap-northeast-1:<アカウントAのID>:parameter/cross-account-param",
            "Type": "SecureString",
            "KeyId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "LastModifiedDate": 1708678145.378,
            "Version": 1,
            "Tier": "Advanced",
            "Policies": [],
            "DataType": "text"
        }
    ]
}
[cloudshell-user@ip-10-134-25-99 ~]$

上記の場合、cross-account-paramというSecureStringのタイプのパラメータが共有されていることが分かります。

上記パラメータを使用するには下記コマンドで参照できます。

aws ssm get-parameter \
  --name "arn:aws:ssm:ap-northeast-1:<アカウントAのID>:parameter/cross-account-param" \
  --with-decryption

注意としては、nameオプションの引数には完全なARNで指定する必要があります。

実行例としては、下記のようになります。

[cloudshell-user@ip-10-134-25-99 ~]$ aws ssm get-parameter \
>   --name "arn:aws:ssm:ap-northeast-1:<アカウントAのID>:parameter/cross-account-param" \
>   --with-decryption
{
    "Parameter": {
        "Name": "cross-account-param",
        "Type": "SecureString",
        "Value": "PASSWORD",
        "Version": 1,
        "LastModifiedDate": 1708678145.378,
        "ARN": "arn:aws:ssm:ap-northeast-1:<アカウントAのID>:parameter/cross-account-param",
        "DataType": "text"
    }
}
[cloudshell-user@ip-10-134-25-99 ~]$

値がPASSWORDというパラメータをクロスアカウントに無事参照することができました。

サポート状況

共有したパラメータへのアクセスにサポートしている統合とサポートされていない統合があります。(2024年2月23日現在の状況)

最新はこちらを確認ください。
Working with shared parameters - AWS Systems Manager

サポートされている統合

  • CloudFormationの動的参照
  • CloudFormation テンプレートパラメータ
  • AWS Parameters and Secrets Lambda Extension
  • EC2の起動テンプレート
  • AMIからインスタンスを作成するためのEC2 RunInstancesコマンドでのImageIDの値
  • Systems Manager Run Commandのコマンド内のパラメータ
  • Systems Manager Automationのランブックにおけるパラメータ値の取得

サポートされていない統合

  • AWS CodeBuildにおける環境変数の値
  • AWS App Runnerにおける環境変数の値
  • Amazon ECSにおけるシークレットの値

参照

おわりに

今回は、アップデートされたSSMパラメータのRAMを使用した共有を検証してみました。

やってみた流れを踏まえて気を付けるべき点をまとめました。

  • パラメータを共有するにはアドバンストパラメータを使用すること
  • SecureStringのパラメータを共有するにはKMSキーでの暗号化が必要なこと
  • SSMのマネジメントコンソール上では共有されたパラメータは表示されないこと
  • パラメータを参照する場合には、完全なARNを指定する必要があること

この記事がどなたかの役に立つと嬉しいです。