AWS Systems Manager 파라미터 스토어에 파라미터 저장해두고 CLI로 취득해보기

2022.04.28

안녕하세요, 임채정입니다.
이번 블로그에서는 파라미터 스토어에 대해서 알아보고 실제로 사용해보려고 합니다.

아젠다

  1. 파라미터 스토어란
  2. 파라미터 스토어에 파라미터 생성
  3. CLI에서 파라미터 취득해보기
  4. 마무리

1. 파라미터 스토어란

  • 구성 데이터 관리 및 암호 관리를 위한 안전한 계층적 스토리지를 제공
  • 파라미터를 생성할 때 지정한 고유 이름을 지정해서 스크립트, 명령어 등에서 참조 가능
  • 이하의 데이터 등을 파라미터 값으로 저장
    • 암호
    • 데이터베이스 문자열
    • Amazon Machine Image(AMI) ID
    • 라이선스 코드
  • 저장 값 종류
    • 문자열
    • 문자열 목록
    • 암호화된 데이터

2. 파라미터 스토어에 파라미터 생성

실제로 파라미터 스토어에 파라미터를 생성해보겠습니다.

AWS Systems Manager 콘솔화면에서 [파라미터 스토어] 태그로 이동합니다.
그리고 새로운 파라미터 생성을 클릭합니다.

이번에는 테스트를 위해 3개정도의 파라미터를 만들겠습니다.

[DB의 URL]
이름: /app/dev/db-url
유형: 문자열
값: mysql://ssmtest:3306

[DB의 비밀번호]
이름: /app/dev/db-password
유형: 보안 문자열
값: password2022

[EC2의 AMI ID]
이름: /EC2/AMI-ID
유형: 문자열
값: ami-081e8fe2fd01c823f

이렇게 3개의 파라미터를 작성했으니까 다음으로 CLI에서 해당 파라미터를 얻어봅시다.

3. CLI에서 파라미터 취득해보기

CLI에서 다양한 방법으로 파라미터를 취득해보겠습니다.

파라미터 취득하기

평범하게 /EC2/AMI-ID에 대한 파라미터를 취득하는 명령어입니다.

aws ssm get-parameters --names /EC2/AMI-ID

{
    "Parameters": [
        {
            "Name": "/EC2/AMI-ID",
            "Type": "String",
            "Value": "ami-081e8fe2fd01c823f",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T13:35:48.911000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/EC2/AMI-ID",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

보안 문자열을 복호화해서 취득하기

/app/dev/db-url/app/dev/db-password를 그냥 가져오면 /app/dev/db-url의 값은 그냥 가져와지지만 보안 문자열인 /app/dev/db-password은 암호화된 문자열로 출력됩니다.

aws ssm get-parameters --names /app/dev/db-url /app/dev/db-password

{
    "Parameters": [
        {
            "Name": "/app/dev/db-password",
            "Type": "SecureString",
            "Value": "AQICAHiyx8ItwrAKNY8Ly6JZE6F/HmLQM0m2KCAn0EugOMV+nwEBQpnRaEIZly65xY9eZ3bYAAAAajBoBgkqhkiG9w0BBwagWzBZAgEAMFQGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6FczyjAUfftwcIh9AgEQgCcFi7/hjdrZdajgXlE+hWFlGaFMc1RxTzY5xw0gIxUxjiEboh+1upY=",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T02:39:49.583000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/app/dev/db-password",
            "DataType": "text"
        },
        {
            "Name": "/app/dev/db-url",
            "Type": "String",
            "Value": "mysql://ssmtest:3306",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T02:38:55.488000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/app/dev/db-url",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

하지만 --with-decryption옵션을 붙여주면 보안 문자열이 복호화되서 출력됩니다.

aws ssm get-parameters --names /app/dev/db-url /app/dev/db-password --with-decryption

{
    "Parameters": [
        {
            "Name": "/app/dev/db-password",
            "Type": "SecureString",
            "Value": "password2022",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T02:39:49.583000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/app/dev/db-password",
            "DataType": "text"
        },
        {
            "Name": "/app/dev/db-url",
            "Type": "String",
            "Value": "mysql://ssmtest:3306",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T02:38:55.488000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/app/dev/db-url",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

경로(path)로 취득하기

이번에는 경로로 파라미터를 취득해보겠습니다.
/app/dev/경로에 있는 모든 파라미터를 취득합니다.

aws ssm get-parameters-by-path --path /app/dev/

{
    "Parameters": [
        {
            "Name": "/app/dev/db-password",
            "Type": "SecureString",
            "Value": "AQICAHiyx8ItwrAKNY8Ly6JZE6F/HmLQM0m2KCAn0EugOMV+nwEBQpnRaEIZly65xY9eZ3bYAAAAajBoBgkqhkiG9w0BBwagWzBZAgEAMFQGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6FczyjAUfftwcIh9AgEQgCcFi7/hjdrZdajgXlE+hWFlGaFMc1RxTzY5xw0gIxUxjiEboh+1upY=",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T02:39:49.583000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/app/dev/db-password",
            "DataType": "text"
        },
        {
            "Name": "/app/dev/db-url",
            "Type": "String",
            "Value": "mysql://ssmtest:3306",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T02:38:55.488000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/app/dev/db-url",
            "DataType": "text"
        }
    ]
}

하지만 /app/의 경우 경로 바로 뒤에 파라미터가 없기 때문에 결과가 표시되지 않습니다.

aws ssm get-parameters-by-path --path /app/

{
    "Parameters": []
}

이럴 경우에는 --recursive옵션이 붙으면 /app/으로 시작되는 모든 파라미터를 출력합니다.

aws ssm get-parameters-by-path --path /app/ --recursive

{
    "Parameters": [
        {
            "Name": "/app/dev/db-password",
            "Type": "SecureString",
            "Value": "AQICAHiyx8ItwrAKNY8Ly6JZE6F/HmLQM0m2KCAn0EugOMV+nwEBQpnRaEIZly65xY9eZ3bYAAAAajBoBgkqhkiG9w0BBwagWzBZAgEAMFQGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6FczyjAUfftwcIh9AgEQgCcFi7/hjdrZdajgXlE+hWFlGaFMc1RxTzY5xw0gIxUxjiEboh+1upY=",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T02:39:49.583000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/app/dev/db-password",
            "DataType": "text"
        },
        {
            "Name": "/app/dev/db-url",
            "Type": "String",
            "Value": "mysql://ssmtest:3306",
            "Version": 1,
            "LastModifiedDate": "2022-04-28T02:38:55.488000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1:763723081076:parameter/app/dev/db-url",
            "DataType": "text"
        }
    ]
}

쿼리를 통해 부분 값만 취득하기

이번에는 필요한 부분만 취득하겠습니다.

/app/dev/db-url/app/dev/db-password의 이름과 값

aws ssm get-parameters --names /app/dev/db-url /app/dev/db-password --query "Parameters[*].{Name:Name,Value:Value}"

[
    {
        "Name": "/app/dev/db-password",
        "Value": "AQICAHiyx8ItwrAKNY8Ly6JZE6F/HmLQM0m2KCAn0EugOMV+nwEBQpnRaEIZly65xY9eZ3bYAAAAajBoBgkqhkiG9w0BBwagWzBZAgEAMFQGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6FczyjAUfftwcIh9AgEQgCcFi7/hjdrZdajgXlE+hWFlGaFMc1RxTzY5xw0gIxUxjiEboh+1upY="
    },
    {
        "Name": "/app/dev/db-url",
        "Value": "mysql://ssmtest:3306"
    }
]

/EC2/AMI-ID의 값만 출력

aws ssm get-parameters --names /EC2/AMI-ID --query "Parameters[*].Value"

[
    "ami-081e8fe2fd01c823f"
]

4. 마무리

지금까지 AWS Systems Manager 의 파라미터 스토어에 대해서 알아봤습니다.
다음은 여기서 좀 더 응용을 해서 해당 파라미터 값을 CloudFormation의 템플릿에서 사용하는 방법에 대해서 알아보겠습니다.

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !