안녕하세요 서후아빠입니다. ^_^
이번 세션은 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 구성요소 생성하기
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 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/
'Management' 카테고리의 다른 글
[이론] Control Tower (Organizations, SSO) 기본 개념 (0) | 2023.02.10 |
---|---|
[실습] Telegram Bot or Slack Channel연동하여 CloudWatch Alarm 메시지 받기 (1) | 2023.01.25 |
[실습] AWS Trusted Advisor 사용하기 (0) | 2022.09.02 |
[이론] AWS Trusted Advisor 기본 개념 (0) | 2022.09.02 |
[실습] Amazon SNS(Simple Notification Service) 실습하기 (Lambda, Slack WebHook, CloudWatch) (0) | 2022.08.17 |