본문 바로가기

Management

[실습] AWS Systems Manager (Session Manager, Parameter Store, Run Command)-1편

반응형

안녕하세요 서후아빠입니다. ^_^

이번 세션은 SSM의 기능 중 Session Manager, Parameter Store, Run Command에 대한 실습을 해보겠습니다.


구성도

SSM 통신(주황색)는 기본적으로 Public 통신이기 때문에 Private Subnet에 위치한 리소스와 SSM이 통신하기 위해서는 VPC Endpoint 구성 필요합니다. VPC Endpoint 구성 후에는 모든 통신이 VPC Endpoint로 이루어집니다.

Run Command 및 Session Manager에서 발생한 로깅과 이벤트는 S3 or CloudWatch Log Group으로 전송이 가능하며, Run Command의 경우는 SNS와 연동하여 실행 결과를 알림받을 수 있습니다. 물론, Session Manager도 EventBridge을 이용하여 추적하려는 이벤트 유형을 SNS 통하여 호출할 수 있습니다.
 
Run Command를 이용하여 EC2로 전달하는 명령(ex : CloudWatch Agent 설치)은 SSM 통신(주황색) 경로를 통해서 이루어지며, EC2의 AWS CLI 명령에서 발생하는 트래픽(ex : 매개변수 조회)도 SSM 통신(주황색) 경로를 통해서 이루어집니다.

EC2 로그는 SSM Agent를 이용하여 CloudWatch Log Group으로 전송 가능합니다. 

사전 작업

인프라 생성 : vpc, subnet, igw, routing table, iam, ec2  등은 설명 생략합니다. 

2022.07.02 - [Networking] - [실습] Amazon VPC 구성요소 생성하기

 

[실습] Amazon VPC 구성요소 생성하기

안녕하세요 서후아빠입니다. ^_^ 이번 세션은 VPC 관련 구성요소에 대해서 실습을 해보겠습니다. 구성도 1단계 : VPC 생성 VPC > Your VPCs > Create VPC 구분 VPC settings (VPC Only 방식) VPC settings (VPC and more 방

sh-t.tistory.com

1단계 : VPC endpoint 생성

VPC > Endpoints > Create endpoint

Endpoint settings Services VPC, Subnets, IP address type, Security groups Policy
Name tag : ssm-ep-1
Service category : AWS services
Service name : com.amazonaws.ap-northeast-2.ssm VPC : vpcA
Subnets : priA-sn
IP address type : IPv4
Security groups : Inbound 443 허용된 그룹 선택
Full access (or Custom)
Name tag : ssm-ep-2
Service category : AWS services
Service name : com.amazonaws.ap-northeast-2.ssmmessages VPC : vpcA
Subnets : priA-sn
IP address type : IPv4
Security groups : Inbound 443 허용된 그룹 선택
Full access (or Custom)
Name tag : ssm-ep-3
Service category : AWS services
Service name : com.amazonaws.ap-northeast-2.ec2messages VPC : vpcA
Subnets : priA-sn
IP address type : IPv4
Security groups : Inbound 443 허용된 그룹 선택
Full access (or Custom)
Region 주의 및 가용성 고려 시 Subnet을 2개 이상 선택합니다.

VPC Endpoint가 없는 경우 SSM Agent는 무조건 Public 통신하기 때문에 Private subnet의 Instance는 Run Command를 통한 Agent 설치가 불가능합니다. (S3, CloudWatch도 별도의 VPC Endpoint가 없는 경우 무조건 Public 통신합니다.)

Session Manager는 VPC Endpoint 없어도 AWS 콘솔에서 접속 가능합니다.

2단계 : SSM Agent 설치

IAM > Roles > Create role

Select trusted entity Add permissions Name, review, and create
Trusted entity type : AWS service 
Use Case : EC2
AmazonEC2RoleforSSM Name : Custom-EC2

EC2 > Instances > pubA-ec2 or PriA-ec2 선택 > Actions > Security > Modify IAM role > Custom-EC2 선택 > Update IAM role

기존 EC2는 생성된 IAM role(ex : Costom-EC2)를 연결해 주고, 신규 생성되는 EC2는 생성 시 “Advanced details > IAM instance profile”에서 IAM role(ex : Custom-EC2)을 연결해 줍니다.

EC2를 SSH로 접속하여 아래 명령어를 수행하여 SSM Agent 설치 (개별 설치하는 경우)

sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl status amazon-ssm-agent

AWS Systems Manager > Quick Setup > Host Management “Create” (대량 설치하는 경우)

Configuration options Targets
Systems Manager : All 체크
Amazon CloudWatch : All  해제
Regions : Current Region (or Choose Regions) 
Intances : All instances (or Tag, Resource group, Manual)
Amazon CloudWatch는 Run Command 실습을 위해 체크 해제하도록 하며, 선택된 인스턴스는 "SSM > Fleet Manager"에서 확인됩니다.  SSM Agent 설치 후에도 확인되지 않으면 EC2에 수동 접속하여 SSM 서비스 재구동 (or 재설치)를 진행하거나 SSM 통신 경로가 정상인지 확인이 필요합니다.

3단계 : Session Manager로 EC2 접속

AWS Systems Manager > Session Manager > Start session > EC2 선택 > Start session

EC2 목록이 보이지 않으면 Start session 한번 클릭합니다. 

세션 연결하는 다른 방법 : EC2 > Instances > EC2 선택 > Connect > Session Manager (tab) > Connect

4단계 : Run command로 CloudWatch Agent  설치

AWS Systems Manager > Run Command > Run command 

Command document Command parameters Target selection
AWS-ConfigureAWSPackage Name : AmazonCloudWatchAgent 
그 외 : 기본값
Target selection : Choose instances manually 
Instances : pubA-ec2 선택 
옵션 : S3, CloudWatch 로그, SNS
S3 옵션 설정 내용 CloudWatch 옵션 설정 내용
Write command output to an Amazon S3 bucket : Enable an S3 bucket
Choose an S3 bucket name from the list : 버킷 선택
Send command output to Amazon CloudWatch logs : Enable CloudWatch logs
Log group name : 로그 그룹 선택
SNS 옵션 설정 순서 및 내용
[사전 설정]
IAM > Policies > Create policy > JSON (tab) > 아래 내용 참조 > Name(sns-publish-permissions) > Create policy

IAM > Roles > Create role > Trusted entity type(AWS service), Use cases for other AWS services(Systems Manager) > Permissions policies (sns-publish-permissions) > Role name(sns-role) > Create role

IAM > Roles > sns-role > ARN값 복사(ex : arn:aws:iam::accound-id:role/sns-role)

[Run Command 옵션 설정]
SNS notifications : Enable
IAM role : arn:aws:iam::accound-id:role/sns-role
SNS topic : arn:aws:sns:region:account-id:sns-topic-name
Event notifications : All events (or In progress or Success or Timed out or Cancelled or Failed)
Change notifications : Command status changes (or Command status on each instance changes)
# JSON : region(ex : ap-northeast-2), account-id(12자리 숫자), sns-topic-name(SNS에 생성한 topic명)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "arn:aws:sns:region:account-id:sns-topic-name"
        }
    ]
}

# SNS 통하여 메일로 발송된 알람 예시
{"commandId":"b89a659f-9bfb-47ad-9a0e-6fb9675080bb","documentName":"AWS-ConfigureAWSPackage","instanceIds":["i-01f4a42fdcb981d62"],"requestedDateTime":"2022-09-22T02:58:38.042Z","expiresAfter":"2022-09-22T05:08:38.042Z","outputS3BucketName":"mybucket","outputS3KeyPrefix":"bucketPrefix","status":"Success","eventTime":"2022-09-22T02:58:49.672Z"}

AWS Systems Manager > Run Command > 생성된 커맨드 선택 > Overall statu에서 “Success” 확인 > Targets and outputs에서 ID 선택 > View output > 실행 결과(Output or Error) 확인

priA-ec2는 다음 단계를 위해서 선택하지 않겠습니다. 

Run Command 실행 결과 및 로그 확인 방법 3가지
 - Run Command 서비스 자체에서 확인
 - S3에 저장된 로그 확인 (옵션)
 - CloudWatch Log Group에 전송된 로그 확인 (옵션)

Run Command를 사용하여 EC2에 Script(ex : Tomcat 설치)를 동작시키고 싶은 경우 
  - Command document : AWS-RunShellScript 선택
  - Command parameters : 실행할 Script를 작성
  - 대상 Instance 선택하여 명령어 실행

EC2(ex : pubA-ec2)에 SSH 접속하여 CloudWatch Agent 설정 진행 : 상세 설명은 CloudWatch 참조

# 설정 진행 
sh-4.2$ sudo su
# cd /opt/aws/amazon-cloudwatch-agent/bin/
# ./amazon-cloudwatch-agent-config-wizard
...중략...
Current config as follows:
{   "agent": { ...중략... }}
...중략...
What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]
AmazonCloudWatch-test-LinuxAgent
...중략...
EC2(pubA-ec2)가 SSM과 통신 가능한 경우, "Current config as follows:" 아래의 "{   "agent": { ...중략... }}"이 자동으로 Parameter Store에 "AmazonCloudWatch-test-LinuxAgent" 이름으로 등록됩니다. 

5단계 : Parameter Store에 등록된 CloudWatch Agent 설정값을 다른 EC2에 적용

AWS Systems Manager > Run Command > Run command

Command document Command parameters Target selection
AmazonCloudWatch-ManageAgent Optional Configuration LocationName : AmazonCloudWatch-test-LinuxAgent
그 외 : 기본값
Target selection : Choose instances manually 
Instances : priA-ec2 선택

AWS Systems Manager > Run Command > 생성된 커맨드 선택 > Overall statu에서 “Success” 확인 > Targets and outputs에서 ID 선택 > View output > 실행 결과(Output or Error) 확인

실행 결과 Fail (… /usr/share/collectd/types.db: no such file or directory) 경우  EC2(priA-ec2)에 SSH 접속하여 명령어 수행
 $ mkdir /usr/share/collectd
 $ cd /usr/share/collectd
 $ touch types.db

Parameter Store의 AmazonCloudWatch-test-LinuxAgent의 Value를 수정하여 다수의 EC2에 적용할 수 있습니다.

6단계 : 계층 구조의 Parameter Store 생성하여 EC2에서 불러오기

AWS Systems Manager > Parameter Store > Create parameter

Name Tier Type Data type Value
/prod/app/db-url Standard String Text mysql://test:3306
/prod/app/db-password Standard SecureString
KMS key source : My current account
KMS Key ID : alias/aws/ssm
- p@ssW0rd

EC2(ex : pubA-ec2 or priA-ec2)에 SSH 접속하여 아래 진행 (AWS CLI 설치 및 로그인 필요)

2022.07.15 - [Other Service] - [실습] AWS CLI 설치 및 CLI 로그인 방법 알아보기

 

[실습] AWS CLI 설치 및 CLI 로그인 방법 알아보기

안녕하세요 서후아빠입니다. ^_^ AWS 작업 중 심심치 않게 AWS CLI 접속을 해야 하는 상황이 발생되는데요 이번 세션은 AWS CLI를 설치하고 로그인하는 방법에 대해서 알아보도록 하겠습니다. 1단계 :

sh-t.tistory.com

# 이름으로 불러오기
$ aws ssm get-parameters --names /prod/app/db-url
{
    "Parameters": [
        {
            "Name": "/prod/app/db-url",
            "Type": "String",
            "Value": "mysql://test:3306",
            "Version": 1,
            "LastModifiedDate": "2022-09-22T08:53:06.393000+00:00",
            "ARN": "arn:aws:ssm:ap-northeast-2:account-id:parameter/prod/app/db-url",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

# 이름으로 불러오기 : 보안 문자열 복호화(옵션 : --with-decryption)
$ aws ssm get-parameters --names /prod/app/db-password
{
    "Parameters": [
        {
            "Name": "/prod/app/db-password",
            "Type": "SecureString",
            "Value": "AQICAHif/ArF/w6wifxLAEYYcnTYGAcm7Lw5Vve1wUzyCS4eJQFWtI990tT2leh9npKBj+8TAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqRnLf/BdTJXnosBAgEQgCMIPOLrBzAXDNQdAa/vlAoAS0MwiOY84qyqI1bDRnqsx8iZdQ==",
            "Version": 1,
            "LastModifiedDate": "2022-09-22T09:13:13.554000+00:00",
            "ARN": "arn:aws:ssm:ap-northeast-2:account-id:parameter/prod/app/db-password",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

$ aws ssm get-parameters --names /prod/app/db-password --with-decryption
{
    "Parameters": [
        {
            "Name": "/prod/app/db-password",
            "Type": "SecureString",
            "Value": "p@ssW0rd",
            "Version": 1,
            "LastModifiedDate": "2022-09-22T09:13:13.554000+00:00",
            "ARN": "arn:aws:ssm:ap-northeast-2:account-id:parameter/prod/app/db-password",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

# 경로로 불려오기
$ aws ssm get-parameters-by-path --path /prod/app/
{
    "Parameters": [
        {
            "Name": "/prod/app/db-password",
            "Type": "SecureString",
            "Value": "AQICAHif/ArF/w6wifxLAEYYcnTYGAcm7Lw5Vve1wUzyCS4eJQFWtI990tT2leh9npKBj+8TAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqRnLf/BdTJXnosBAgEQgCMIPOLrBzAXDNQdAa/vlAoAS0MwiOY84qyqI1bDRnqsx8iZdQ==",
            "Version": 1,
            "LastModifiedDate": "2022-09-22T09:13:13.554000+00:00",
            "ARN": "arn:aws:ssm:ap-northeast-2:account-id:parameter/prod/app/db-password",
            "DataType": "text"
        },
        {
            "Name": "/prod/app/db-url",
            "Type": "String",
            "Value": "mysql://test:3306",
            "Version": 1,
            "LastModifiedDate": "2022-09-22T08:53:06.393000+00:00",
            "ARN": "arn:aws:ssm:ap-northeast-2:account-id:parameter/prod/app/db-url",
            "DataType": "text"
        }
    ]
}

# 경로로 불러오기 : 해당 경로 하위까지 (옵션 : --recursive)
$ aws ssm get-parameters-by-path --path /prod/ --recursive
{
    "Parameters": [
        {
            "Name": "/prod/app/db-password",
            "Type": "SecureString",
            "Value": "AQICAHif/ArF/w6wifxLAEYYcnTYGAcm7Lw5Vve1wUzyCS4eJQFWtI990tT2leh9npKBj+8TAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqRnLf/BdTJXnosBAgEQgCMIPOLrBzAXDNQdAa/vlAoAS0MwiOY84qyqI1bDRnqsx8iZdQ==",
            "Version": 1,
            "LastModifiedDate": "2022-09-22T09:13:13.554000+00:00",
            "ARN": "arn:aws:ssm:ap-northeast-2:account-id:parameter/prod/app/db-password",
            "DataType": "text"
        },
        {
            "Name": "/prod/app/db-url",
            "Type": "String",
            "Value": "mysql://test:3306",
            "Version": 1,
            "LastModifiedDate": "2022-09-22T08:53:06.393000+00:00",
            "ARN": "arn:aws:ssm:ap-northeast-2:account-id:parameter/prod/app/db-url",
            "DataType": "text"
        }
    ]
}

# 쿼리(필터링)로 불러오기
$ aws ssm get-parameters --names /prod/app/db-url /prod/app/db-password --query "Parameters[*].{Name:Name,Value:Value}"
[
    {
        "Name": "/prod/app/db-password",
        "Value": "AQICAHif/ArF/w6wifxLAEYYcnTYGAcm7Lw5Vve1wUzyCS4eJQFWtI990tT2leh9npKBj+8TAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqRnLf/BdTJXnosBAgEQgCMIPOLrBzAXDNQdAa/vlAoAS0MwiOY84qyqI1bDRnqsx8iZdQ=="
    },
    {
        "Name": "/prod/app/db-url",
        "Value": "mysql://test:3306"
    }
]

기타 : Session Manager 로깅 설정

AWS Systems Manager > Session Manager > Preferences (tab) > Edit

General preferences CloudWatch logging S3 logging
Idle session timeout : 20분
Maximum session duration : -
KMS encryption : -
CloudWatch logging : - Send session logs to S3 : -

참고 URL

SSM Agent 자동 설치

  - Linux : https://aws.amazon.com/ko/premiumsupport/knowledge-center/install-ssm-agent-ec2-linux/

  - Windows : https://igfap.live/xxx-https-aws.amazon.com/ko/premiumsupport/knowledge-center/ssm-agent-windows-ec2/

반응형