こんにちは、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を指定する必要があること
この記事がどなたかの役に立つと嬉しいです。