AWS Systems Manager

Page content

systems manager パラメータストア

Lambda からあるパラメータを分離し、かつ程々安全に管理したい。そう思った時に出てくるのがパラメータストア。

仕様等

  • 可用性: 記載なし

  • リージョン: グローバルではなく、リージョンごとにパラメータストアを持つ仕様

  • GetParam*** オペレーションの最大性能 (1 秒あたりのトランザクション数)

    • デフォ: 40
    • IAMポリシーをいじると 100 とか 1000 TPS (transaction per sec) に上げられるらしい
      • ここ によると ***/high-throughput-enabled というのをつけるそうな
    • ただ、一番使いたい GetParametersByPath オペレーションは100までしか 上がらないらしい
  • 料金 (as of 2019/06/07)

    • Parameter Storage
Parameter typePricing
StandardNo additional charge
Advanced$0.05 per advanced parameter per month (prorated hourly if the parameter is stored less than a month)
- API Interactions
Parameter typePricing - Standard ThroughputPricing - Higher Throughput
StandardNo additional charge$0.05 per 10,000 Parameter Store API interactions
Advanced$0.05 per 10,000 Parameter Store API interactions$0.05 per 10,000 Parameter Store API interactions
- 100 rps で 30 日回したら `100 * 86400 * 30 * 0.05 / 10000 = $1,296/mth` たけぇ!
- 参考: DynamoDB table でやると `0.0001484 * 100 * 24 * 30 = $10.6848/mth`

高頻度でアクセスするようなものは割高になるので、Secure String parameter で秘匿性をどうしても高めたいような場合以外は不採用の気持ちです(´・ω・`)

管理方法 (検討中)

  • / で区切るとパスとして扱えるようなので、うまくツリー状に管理したい。
    /prod/rooms/users/01_hoge: 11111
    /prod/rooms/users/03_fuga: 33333
    /prod/rooms/admins/02_hehe: 22222
    /test/rooms/users/01_test: testest
    

cli でお試し

# メタデータ参照
bash-3.2$ aws ssm describe-parameters
    {
        "Parameters": [
            {
                "Name": "/prod/rooms/users/01_hoge",
                "Type": "String",
                "LastModifiedDate": 1559822768.138,
                "LastModifiedUser": "arn:aws:iam::1111111111:users/hogedeveloper",
                "Version": 1
            }
        ]
    }

# メタデータ参照 (filterが可能)
bash-3.2$ aws ssm describe-parameters --filters "Key=Name, Values=/prod/rooms/users/01_hoge"

# 追加
bash-3.2$ aws ssm put-parameter --name "/prod/rooms/users/01_hoge" --value "11111" --type String
{
    "Version": 1
}
# 追加
bash-3.2$ aws ssm put-parameter --name "/prod/rooms/users/02_fuga" --value "22222" --type String
{
    "Version": 1
}
# 別パスに追加
bash-3.2$ aws ssm put-parameter --name "/prod/rooms/admins/01_hoho" --value "hohoho" --type String
{
    "Version": 1
}
# get-parameters-by-path ではパラメータ名まで指定したら応答なし
bash-3.2$ aws ssm get-parameters-by-path --path "/prod/rooms/users/01_hoge"
{
    "Parameters": []
}
# get-parameters-by-path では指定したパスの直下のパラメータたちが取得される
bash-3.2$ aws ssm get-parameters-by-path --path "/prod/rooms/users"
{
    "Parameters": [
        {
            "Name": "/prod/rooms/users/01_hoge",
            "Type": "String",
            "Value": "11111",
            "Version": 1,
            "LastModifiedDate": 1559879718.529,
            "ARN": "arn:aws:ssm:ap-northeast-1:1111111111:parameter/prod/rooms/users/01_hoge"
        },
        {
            "Name": "/prod/rooms/users/02_fuga",
            "Type": "String",
            "Value": "22222",
            "Version": 1,
            "LastModifiedDate": 1559879734.29,
            "ARN": "arn:aws:ssm:ap-northeast-1:1111111111:parameter/prod/rooms/users/02_fuga"
        }
    ]
}
# get-parameters-by-path では2階層以上下のパスは手に入らない
bash-3.2$ aws ssm get-parameters-by-path --path "/prod/rooms"
{
    "Parameters": []
}
# 上書き (誤り)
bash-3.2$ aws ssm put-parameter --name "/prod/rooms/admins/01_hoho" --value "ufufufu" --type String

An error occurred (ParameterAlreadyExists) when calling the PutParameter operation: The parameter already exists. To overwrite this value, set the overwrite option in the request to true.
# 上書き (正しい)
bash-3.2$ aws ssm put-parameter --name "/prod/rooms/admins/01_hoho" --value "ufufufu" --type String --overwrite
{
    "Version": 2
}

# 参照 (get-parameters) ... invalidParametersって?
bash-3.2$ aws ssm get-parameters --name "/prod/rooms/users/01_hoho"
{
    "Parameters": [
        {
            "Name": "/prod/rooms/users/01_hoho",
            "Type": "String",
            "Value": "ufufufu",
            "Version": 2,
            "LastModifiedDate": 1559823379.852,
            "ARN": "arn:aws:ssm:ap-northeast-1:1111111111:parameter/prod/rooms/users/01_hoho"
        }
    ],
    "InvalidParameters": []
}

# 参照 (get-parameter)
bash-3.2$ aws ssm get-parameter --name "/prod/rooms/users/01_hoho"
{
    "Parameter": {
        "Name": "/prod/rooms/users/01_hoho",
        "Type": "String",
        "Value": "ufufufu",
        "Version": 2,
        "LastModifiedDate": 1559823379.852,
        "ARN": "arn:aws:ssm:ap-northeast-1:1111111111:parameter/prod/rooms/users/01_hoho"
    }
}