kakakakakku blog

Weekly Tech Blog: Keep on Learning!

LocalStack を使って SSM Parameter Store をローカル環境で操作する

AWS Systems Manager Parameter Store を使ったアプリケーションを開発するときに,ローカル環境ではできる限り AWS アカウントに依存しないようにしたく,LocalStack を使う機会があったので調査ログをまとめておく.結果的に AWS Systems Manager Parameter Store のほとんどの API がサポートされていて良かった❗️CI/CD パイプラインで自動テストするときにも使える〜

github.com

LocalStack のセットアップ方法は複数あるからドキュメント参照で📝最近だと Docker Desktop の Extensions にも対応していて,1番簡単かも👌今回は Extensions を使った.

docs.localstack.cloud

AWS Systems Manager Parameter Store API

LocalStack では AWS Systems Manager Parameter Store 関連の API がほとんどサポートされている❗️

  • DeleteParameter
  • DeleteParameters
  • DescribeParameters
  • GetParameter
  • GetParameterHistory
  • GetParameters
  • GetParametersByPath
  • LabelParameterVersion
  • PutParameter

(現時点だと)唯一 UnlabelParameterVersion だけはサポートされてなく,使う場合は要注意〜

  • UnlabelParameterVersion

docs.localstack.cloud

PutParameter

AWS CLI を実行するときに --endpoint-url http://localhost:4566 オプションを付けると LocalStack を操作できる.AWS Systems Manager Parameter Store の PutParameter を AWS CLI で実行する場合は以下のようになる.もちろん SecureString も使える👌(暗号化自体はされないけど)

$ aws --endpoint-url http://localhost:4566 ssm put-parameter --name '/parameter/string' --type 'String' --value 'value/String'
{
    "Version": 1
}

$ aws --endpoint-url http://localhost:4566 ssm put-parameter --name '/parameter/secure-string' --type 'SecureString' --value 'value/SecureString'
{
    "Version": 1
}

さらに LocalStack AWS CLI (awslocal コマンド) を使うと --endpoint-url オプションを付けなくても実行できて,もっとシンプルになる.本記事では awslocal コマンドを使った例を載せていく.

$ export DEFAULT_REGION=ap-northeast-1
$ awslocal ssm put-parameter --name '/parameter/awslocal' --type 'String' --value 'value/awslocal'
{
    "Version": 1
}

github.com

GetParameter

$ awslocal ssm get-parameter --name '/parameter/string'
{
    "Parameter": {
        "Name": "/parameter/string",
        "Type": "String",
        "Value": "value/String",
        "Version": 1,
        "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
        "ARN": "arn:aws:ssm:ap-northeast-1:000000000000:parameter/parameter/string",
        "DataType": "text"
    }
}

DeleteParameter

$ awslocal ssm delete-parameter --name '/parameter/string'
$ awslocal ssm delete-parameter --name '/parameter/secure-string'

DescribeParameters

今度はパラメータを3個追加してから DescribeParameters を実行する.

$ awslocal ssm put-parameter --name '/service1/parameter1' --type 'String' --value 'value1'
$ awslocal ssm put-parameter --name '/service1/parameter2' --type 'String' --value 'value2'
$ awslocal ssm put-parameter --name '/service1/parameter3' --type 'String' --value 'value3'

$ awslocal ssm describe-parameters
{
    "Parameters": [
        {
            "Name": "/service1/parameter1",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Version": 1,
            "DataType": "text"
        },
        {
            "Name": "/service1/parameter2",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Version": 1,
            "DataType": "text"
        },
        {
            "Name": "/service1/parameter3",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Version": 1,
            "DataType": "text"
        }
    ]
}

GetParameters

$ awslocal ssm get-parameters --names /service1/parameter1 /service1/parameter2
{
    "Parameters": [
        {
            "Name": "/service1/parameter1",
            "Type": "String",
            "Value": "value1",
            "Version": 1,
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:000000000000:parameter/service1/parameter1",
            "DataType": "text"
        },
        {
            "Name": "/service1/parameter2",
            "Type": "String",
            "Value": "value2",
            "Version": 1,
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:000000000000:parameter/service1/parameter2",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

GetParametersByPath

$ awslocal ssm get-parameters-by-path --path /service1/
{
    "Parameters": [
        {
            "Name": "/service1/parameter1",
            "Type": "String",
            "Value": "value1",
            "Version": 1,
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:000000000000:parameter/service1/parameter1",
            "DataType": "text"
        },
        {
            "Name": "/service1/parameter2",
            "Type": "String",
            "Value": "value2",
            "Version": 1,
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:000000000000:parameter/service1/parameter2",
            "DataType": "text"
        },
        {
            "Name": "/service1/parameter3",
            "Type": "String",
            "Value": "value3",
            "Version": 1,
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:000000000000:parameter/service1/parameter3",
            "DataType": "text"
        }
    ]
}

DeleteParameters

$ awslocal ssm delete-parameters --names /service1/parameter1 /service1/parameter2 /service1/parameter3
{
    "DeletedParameters": [
        "/service1/parameter1",
        "/service1/parameter2",
        "/service1/parameter3"
    ],
    "InvalidParameters": []
}

GetParameterHistory

ssm put-parameter --overwrite コマンドを使ってパラメータを更新してから GetParameterHistory を実行する.

$ awslocal ssm put-parameter --name 'parameter1' --type 'String' --value 'version1'
{
    "Version": 1
}

$ awslocal ssm put-parameter --name 'parameter1' --type 'String' --value 'version2' --overwrite
{
    "Version": 2
}

$ awslocal ssm put-parameter --name 'parameter1' --type 'String' --value 'version3' --overwrite
{
    "Version": 3
}

$ awslocal ssm get-parameter-history --name 'parameter1'
{
    "Parameters": [
        {
            "Name": "parameter1",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Value": "version1",
            "Version": 1,
            "Labels": [],
            "DataType": "text"
        },
        {
            "Name": "parameter1",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Value": "version2",
            "Version": 2,
            "Labels": [],
            "DataType": "text"
        },
        {
            "Name": "parameter1",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Value": "version3",
            "Version": 3,
            "Labels": [],
            "DataType": "text"
        }
    ]
}

LabelParameterVersion

最後は LabelParameterVersion を実行してパラメータに verified ラベルを追加する例を載せる.パラメータ parameter1 の最新バージョンにのみ verified ラベルが追加されている.

$ awslocal ssm label-parameter-version --name parameter1 --labels verified
{
    "InvalidLabels": [],
    "ParameterVersion": 3
}

$ awslocal ssm get-parameter-history --name 'parameter1'
{
    "Parameters": [
        {
            "Name": "parameter1",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Value": "version1",
            "Version": 1,
            "Labels": [],
            "DataType": "text"
        },
        {
            "Name": "parameter1",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Value": "version2",
            "Version": 2,
            "Labels": [],
            "DataType": "text"
        },
        {
            "Name": "parameter1",
            "Type": "String",
            "LastModifiedDate": "2023-04-24T00:00:00.000000+09:00",
            "LastModifiedUser": "N/A",
            "Value": "version3",
            "Version": 3,
            "Labels": [
                "verified"
            ],
            "DataType": "text"
        }
    ]
}

まとめ

LocalStack でサポートされている AWS Systems Manager Parameter Store 関連の API を調査した.結果的にほとんどの API がサポートされていて良かった❗️LocalStack をどんどん使っていくぞ〜🚀