2023. 10. 8. 17:28ใAWS
โ๏ธ To-Be Architecture
์ํคํ ์ฒ์ ์ ์ฒด Flow๋ ๊ฐ๋จํ๋ค.
โ ์ผ์ ๊ธฐ๊ฐ ์ฌ์ฉํ์ง ์์ ์ํธ ๋๋ access key๋ฅผ ๊ฐ์ง๊ณ ์๋ IAM user ์ถ์ถ ( AWS Config )
โก IAM user์ ๋ํ Email ๋ฐ์ก ( AWS SES )
โ ์ ๋ํ โก์ ๋์์ ์๋ํํ๊ธฐ ์ํด AWS Config์ Remediation ๊ธฐ๋ฅ๊ณผ AWS Systems Manager์ Automation์ ์ด์ฉํ๋ค.
์ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ฑํ๋ ์ ์ฐจ๋ ์๋์ ๊ฐ์ ์์๋ก ์งํํ์๋ค.
- AWS Config ๊ท์น ์ค์
- Amazon SES ์ฌ์ ์ค์
- SES๋ก ์ด๋ฉ์ผ์ ๋ฐ์กํ๊ธฐ ์ํ AWS SSM Document ์คํฌ๋ฆฝํธ ์์ฑ
- 1์์ ์ค์ ํ Config ๊ท์น์ 3์ Document๋ฅผ ์ฐ๊ฒฐํ๋ Config Remediation ์ค์
1. AWS Config์์ ๊ท์น ์ถ๊ฐํ๊ธฐ
AWS Managed rule ์ค iam-user-unused-credentials-check ๊ท์น์ ์ถ๊ฐํ์ฌ AWS IAM(Identity and Access Management) ์ฌ์ฉ์๊ฐ ์ง์ ๋ ์ผ ๋ด์ ์ฌ์ฉ๋์ง ์์ ์ํธ ๋๋ ํ์ฑ ์ก์ธ์ค ํค๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํด ๋ณด์.
Evaluation mode
๊ณ์ ์ config rule์ ์ถ๊ฐํ ๋, AWS Config๊ฐ ๋ฆฌ์์ค๋ฅผ ํ๊ฐํ ์๊ธฐ๋ฅผ ์ง์ ํ ์ ์๋ค. Config Rule์ ๋ฐ๋ผ AWS Config๋ ๋ฆฌ์์ค๊ฐ ๋ฐฐํฌ๋๊ธฐ ์ , ๋๋ ๋ฆฌ์์ค๊ฐ ๋ฐฐํฌ๋ ํ, ๋๋ ๋ ๊ฒฝ์ฐ ๋ชจ๋์ ๋ฆฌ์์ค ๊ตฌ์ฑ์ ํ๊ฐํ ์ ์๋ค.
- proactive evaluation : ๋ฐฐํฌ๋๊ธฐ ์ ๋ฆฌ์์ค๋ฅผ ํ๊ฐ
- detective evaluation : ๋ฐฐํฌ๋ ํ ๋ฆฌ์์ค๋ฅผ ํ๊ฐ
trigger type
AWS Config rule์ด ๋ฆฌ์์ค๋ฅผ ์ผ๋ง๋ ์์ฃผ ํ๊ฐํ ์ง ๋ช ์ํ๋ค. ๋ฆฌ๋ก์ค๋ ๊ตฌ์ฑ ๋ณํ๊ฐ ์์ ๋ ๋๋ ์ฃผ๊ธฐ์ ์ค์ผ์ค์ ์ ํด ํ๊ฐ๋ ์๋ ์๋ค.
AWS Config Rule์ ์ค์ ํ๋ฉด ํด๋น rule์ ์ค์ํ์ง ๋ชปํ๋(non-compliant) ๋ฆฌ์์ค๋ฅผ ํ์ ํ ์ ์๋ค.
Remediate
Config์ ๊ธฐ๋ฅ์ผ๋ก AWS Config๊ฐ Non-Compliant ๋ฆฌ์์ค๋ฅผ ๊ฐ์งํ๋ฉด AWS Systems Manager Automation ๋ฌธ์๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ Non-Compliant ๋ฆฌ์์ค๋ฅผ ์ํ๋ ์ํ๋ก ๋ณ๊ฒฝํ๋ค. AWS์์ ์ ๊ณตํ๋ Document๋ฅผ ์ด์ฉํ ์๋ ์๊ณ custom ํ๊ฒ ๋ง๋ SSM Document๋ฅผ ์ด์ฉํ ์๋ ์๋ค.
AWS Config Rule > Action > Manage remediation์ ์ด์ฉํ์ฌ ํด๋น rule์ ๋ํ ์๋ ๋๋ ์๋ remediation ๋ฐฉ๋ฒ์ ์ค์ ํ ์ ์๋ค. ๋จ, service์ ์ฐ๊ฒฐ๋์ง ์์ Config rule์ ๋ํด์๋ง remediation์ ์ค์ ํ ์ ์๋ค.
์ง๊ธ์ Remediate์ ์ฐ๊ฒฐํ Document๊ฐ ์๊ธฐ ๋๋ฌธ์ AWS Systems Manager์์ ๋ฉ์ผ ๋ฐ์ก ์คํฌ๋ฆฝํธ ์์ฑ ํ, ์ค์ ํ๋ค.
2. Amazon SES ์ค์ ํ๊ธฐ
2-1. ์ด๋ฉ์ผ ์ฃผ์ ํ์ธ
Amazon SES๋ฅผ ํตํด ๋ณธ์ธ์ ์ด๋ฉ์ผ ์ฃผ์์์ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ค๋ฉด ๋จผ์ ํด๋น ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ํ์ธํ์ฌ ์ด๋ฉ์ผ ์ฃผ์์ ์์ ์์์ Amazon SES์ ์ธ์ฆํด์ผ ํ๋ค. ์๊ฒฉ์ฆ๋ช ์์ฑ ํ 5๋ถ ๋ด์ ํ์ธ ์ด๋ฉ์ผ์ ์์ ํด์ผ ํ๋ค.
์ ๊ทธ๋ฆผ์์ ๋ ธ๋์ ์นธ์ ํด๋นํ๋ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด SES console์์ ์ด๋ฉ์ผ ์ธ์ฆ์ด verified ๋์๋ค๋ ๋ฌธ๊ตฌ๊ฐ ๋ฐ ์ค ์์๋๋ฐ ๊ณ์ ์๋ํด๋ ์๋ ๊ฐ์ด๋ ๋ฌธ์๋ง ๋ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ค ์์๋ค.
๋งํฌ๋ฅผ ํด๋ฆญํ์ ๋ ์ ๊ฐ์ด๋ ๋ฌธ์๋ก ์ด๋ฆฐ๋ค๋ ๊ฒ ์ ๋ง ์ด์ํ์ง๋ง, SES ์ฝ์์์ ํด๋น ์ด๋ฉ์ผ์ด verified ๋์์์ ํ์ธํ ์ ์๋ค.
Send test email์ ํตํด ํ ์คํธ ์ด๋ฉ์ผ์ ๋ฐ์กํด ๋ณผ ์ ์๋ค. ํ ์คํธ ์ด๋ฉ์ผ์ ์ธ์ฆํ ์ด๋ฉ์ผ ์ฃผ์์์ ๋ฐ์ก๋ ๋ฉ์ผ์ ์ฒจ๋ถํ์ผ๋ก ํฌ์๋ฉํ ํํ๋ก ์ ์ก๋๋ค.
2-2. SES Sandbox ํด์
AWS๋ ์ ๊ท AWS Account๋ฅผ Amazon SES Sandbox์ ๋ฐฐ์นํ๋ค. AWS Account๊ฐ Sandbox ์ํ์ธ ๊ฒฝ์ฐ, SES์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ง๋ง ํ์ธ๋ ์ด๋ฉ์ผ ์ฃผ์๋ก๋ง ๋ฉ์ผ์ ๋ณด๋ผ ์ ์๋ค. AWS Account๊ฐ SES Sandbox ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ, ์์ ์์ ์ฃผ์ ๋๋ ๋๋ฉ์ธ์ด ์ธ์ฆ๋์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์์ ์์๊ฒ ์ด๋ฉ์ผ์ ๋ฐ์กํ ์ ์๋ค. ๋ฐ๋ผ์ sandbox ์ํ ํด์ ๊ฐ ํ์ํ๋ค.
๐ Request ์๋ฌธ
- Region : ap-northeast-2
- Use Case: When I receive a request to create an iam user, I will enter the requestor's business email in the user's tag. A notification email will be sent to IAM Users who have not used their credentials for more than 90 days. Therefore, I need a function to send it to an unauthorized mail address.
The email transmission logic using Amazon SES will be included in AWS Systems Manager's document and performed through the automation function. Automation action will be configured to be logged to cloudwatch logs.
The frequency of sending e-mails is currently expected to be 1 to 10 per day. This was calculated by expecting a user who did not access for 90 days among IAM users.
In the body of the mail to be sent, we will make it possible to block the receipt of the mail, including "If you want to block the reception, please give me an email separately" with the administrator's email.
Please move this account out of AWS SES Sandbox.
3. Systems Manager Automation Document ์์ฑ
1์์ ์์ฑํ AWS Config Rule์ Remediation์ผ๋ก ์ง์ ํ AWS Systems Manager Documents๋ฅผ ์์ฑํ๋ค.
Document ์์ฑ ์, ํ์ ์ Automation์ ์ ํํ๋ค. Automation์ AWS ๋ฆฌ์์ค์ ๋ํ workflow(์ ์ง๋ณด์ ๋ฐ ๋ฐฐํฌ ๋ฑ)๋ฅผ ์์ฑ, ๊ด๋ฆฌ ๋ฐ ์คํํ ์ ์๋ AWS Systems Manager์ ๊ธฐ๋ฅ์ด๋ค. SSM Automation์ AWS SSM Document๋ฅผ ํ์ฉํ์ฌ ์๋ํ ์ํฌํ๋ก์ฐ์ ๋จ๊ณ์ ์์ ์ ์ ์ํ๋ค. ๋ฐ๋ณต ์์ ์ ์๋ํํ๊ณ ์ด์ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ฉฐ ์ธํ๋ผ ์ ๋ฐ์์ ์ผ๊ด๋ ์ ์ฐจ ์คํ์ ๋ณด์ฅํ๋ค.
๐ก ์ฐธ๊ณ
AWS๋ AWS SSM Document ์ด๋ฆ์ ์ ๋์ฌ๋ก ์ฌ์ฉํ๊ธฐ ์ํด aws, amazon, amzn์ ์์ฝํ๊ธฐ ๋๋ฌธ์ document ์์ฑ ์ ์ ๋์ฌ๋ก ์ฌ์ฉํ ์ ์๋ค.
Input Parameter๋ก SSM Automation์๊ฒ ๋ถ์ฌํ AutomationAssumeRole, Config Rule์ ๋ถํฉํ์ง ์๋ IAM ์ ์ ์ ID, ๋ฉ์ผ ๋ฐ์ก์ ์ํ ๋ฐ์ ์ ์ด๋ฉ์ผ๊ณผ ๋ฉ์ผ์ ํ๊ธฐ๋๋ ๋ฐ์ ์ ์ด๋ฆ์ด ํ์ํ๋ค. ์ด๋ 4. Config Remediation ์ค์ ์์ ์ ๋ ฅํ๋ค.
Document๋ IAM User์ ์ ๋ณด๋ฅผ ์ป์ด์ค๋ ๋จ๊ณ, ๊ทธ๋ฆฌ๊ณ AWS SES๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์ ์ด๋ฉ์ผ ์ฃผ์๋ก ๋ฉ์ผ์ ๋ฐ์กํ๋ ๋จ๊ณ์ ์ด ๋ ๋จ๊ณ๋ก ๊ตฌ์ฑํ์๋ค.
3-1. (Step 1) GetUserInfo
from time import sleep
import boto3
THROTTLE_PERIOD = 0.05
def get_username(iam_client, iam_user_id):
paginator = iam_client.get_paginator("list_users")
page_iterator = paginator.paginate()
for page in page_iterator:
for user in page["Users"]:
if user["UserId"] == iam_user_id:
return user["UserName"]
sleep(THROTTLE_PERIOD)
def get_user_email_tag(iam_client, iam_username):
tags = iam_client.list_user_tags(UserName=iam_username)
email_tag = list(filter(lambda tag: tag['Key'].lower() == 'email', tags["Tags"]))
return email_tag
def handler(event, context):
iam_client = boto3.client("iam")
iam_user_id = event["IAMUserId"]
iam_username = get_username(iam_client, iam_user_id)
if iam_username is None:
error_message = f"AWS IAM USER ID, {iam_user_id} DOES NOT EXIST."
raise Exception(error_message)
email_tag = get_user_email_tag(iam_client, iam_username)
if len(email_tag) == 1:
return {"UserName":iam_username, "UserEmail": email_tag[0]['Value']}
else:
error_message = f"AWS IAM User {iam_username} DOES NOT HAVE AN EMAIL-RELATED TAGS."
raise Exception(error_message)
Boto3 Docs: IAM > Client > list_users (2023.07.02 ๊ธฐ์ค)์ ๋ฐ๋ฅด๋ฉด user์ tag๋ ๋ฆฌํด๋์ง ์๋๋ค. ์ค์ ๋ก resourceID๋ฅผ ํตํด list_users๋ก ๋ฆฌํด ๋ฐ์ user๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
{
"Path": "/",
"UserName": {IAM-USER-NAME},
"UserId": "{IAM-USER-ID}",
"Arn": "arn:aws:iam::{ACCOUNT-ID}:user/{IAM-USER-NAME}",
"CreateDate": "2022-05-31 04:09:05+00:00",
"PasswordLastUsed": "2023-07-02 07:24:36+00:00"
}
๋ฐ๋ผ์ get_username ํจ์์์ userName์ ๋ฐ๊ณ get_user_email_tag ํจ์์์ list_user_tags๋ฅผ ์ด์ฉํด tag๋ฅผ ๋ฆฌํด ๋ฐ์๋ค. ํด๋น SSM Automation ๋ฌธ์๋ IAM ์ ์ ์ "email" ํค์ ํ๊ทธ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ๋ฉ์ผ ๋ฐ์ก๊น์ง ์คํ๋๋ ๋ฐ๋์ ์ฌ์ ์ IAM ์ ์ ์ ํ๊ทธ๋ก email์ ์ ๋ ฅํ๋ ์์ ์ด ํ์ํ๋ค.
3-2. (Step 2) SendEmail
import json
import boto3
import base64
from botocore.exceptions import ClientError
def sendEmail(sender_email, sender_name, user_email, user_name):
CHARSET = "utf-8"
sendername_bytes = sender_name.encode(CHARSET)
sendername_b64 = base64.b64encode(sendername_bytes)
sendername_b64_str = str(sendername_b64)
SENDER_NAME = f"=?{CHARSET}?B?{sendername_b64_str[2:-1]}?="
SENDER = f"{SENDER_NAME} <{sender_email}>"
RECIPIENT = user_email
AWS_REGION = "ap-northeast-2"
SUBJECT = "=====mail subject====="
BODY_TEXT = (f"======body text======")
BODY_HTML = f"""<html>
<head></head>
<body>
<p>AWS IAM ์ ์ {user_name}์ ??์ผ ๋์ ์ฌ์ฉ๋์ง ์์ ์ํธ ๋๋ ํ์ฑ ์ก์ธ์ค ํค๊ฐ ์์ต๋๋ค. ์กฐ์น ๋ฐ๋๋๋ค.</p>
</body>
</html>"""
client = boto3.client('ses',region_name=AWS_REGION)
try:
response = client.send_email(
Destination={
'ToAddresses': [
RECIPIENT,
],
},
Message={
'Body': {
'Html': {
'Charset': CHARSET,
'Data': BODY_HTML,
},
'Text': {
'Charset': CHARSET,
'Data': BODY_TEXT,
},
},
'Subject': {
'Charset': CHARSET,
'Data': SUBJECT,
},
},
Source=SENDER
)
except ClientError as e:
print(e.response['Error']['Message'])
raise e
else:
print("Email sent! Message ID:"),
print(json.dumps(response, indent=2))
def handler(event, context):
sender_email = event["SenderEmail"]
sender_name = event["SenderName"]
user_email = event["UserEmail"]
user_name = event["UserName"]
sendEmail(sender_email, sender_name, user_email, user_name)
๋ฐ์ ์ ์ด๋ฆ์ ํ๊ธ๋ก ํ๊ธฐํ๋ฉด ๊นจ์ง๋ ํ์์ ํผํ๊ธฐ ์ํด ์ธ์ฝ๋ฉ ํ ๋ฌธ์์ด์ ์๋ฅด๋ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์๋ค. ์์ธํ ๋ด์ฉ์ ์๋ ํฌ์คํ ์ฐธ์กฐ.
3-3. IAM Role ์์ฑ
SSM Document๊ฐ IAM ์ ์ ์ ๋ณด๋ฅผ ์กฐํํ๊ณ , SES๋ฅผ ํตํด ๋ฉ์ผ์ ๋ฐ์กํ๊ธฐ ์ํ ๊ถํ์ด ์๋ IAM Role์ด ํ์ํ๋ค.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:ListUsers",
"iam:ListUserTags",
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ssm.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
3-4. Debugging
Automation Document๋ฅผ ์์ ํ๋ฉด์ Config์์ manage remediate๋ฅผ ํตํด ํ ์คํธ๋ฅผ ์งํํ๋ค. document๋ฅผ ์ ๋ฒ์ ์ผ๋ก ๋ฐํํ๊ณ ๋ฐ๋ก remediate๋ฅผ ์ํํ๋ฉด ์ ๋ฒ์ ์ default ๋ฒ์ ์ผ๋ก ์ง์ ํ์์๋ ๋ถ๊ตฌํ๊ณ ์ ๋ฒ์ ์ document๊ฐ ๋ฐ์๋์ง ์๋๋ค. ๋ฐ๋ผ์ ํ ์คํธ๋ฅผ ์งํํ ๋๋ SSM Document์์ ์์ Resource ID๋ฅผ ๊ฐ์ ธ์ Execute automation์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ฉฐ ๋๋ฒ๊น ํ๋ ๊ฒ์ด ์ข๋ค.
Boto3 Error: botocore.exceptions.NoCredentialsError: Unable to locate credentials
Role ์ค์ ์ด ์ ๋๋ก ๋์ง ์์ ๋ฐ์ํ๋ ์๋ฌ. Automation Document์ assumeRole ๊ฐ์ ํ์ธํ์.
4. Config Remediation ์ค์
1์์ ์ค์ ํ Config ๊ท์น์ Config Remediation ์ค์ ํ๋ค.
Remediation Method์์ Automatic remediation์ ์ ํํ๊ณ , Remediation action์ผ๋ก๋ 3์์ ์์ฑํ AWS SSM Automation Document๋ฅผ ์ฐ๊ฒฐํ๋ค.
์ฐ๊ฒฐํ SSM Document์ ๋ด์ฉ์ ๋ฐ๋ผ Resource ID parameter, Parameters๋ฅผ ์ ๋ ฅํ๋ ํ๋ฉด์ด ๋ณ๊ฒฝ๋๋ค. Config Remediation ์ค์ ์ parameters ๊ฐ์ ์ง์ ํ์ฌ SSM Document์ Input Parameter์ ๊ฐ์ ์ ๋ฌํ๋ค. Resource ID Parameter๋ฅผ ์ด์ฉํ์ฌ Config rule์ ๋ถํฉํ์ง ์๋ ๋ฆฌ์์ค์ ID๋ฅผ ์ ๋ฌํ ์ ์๋๋ฐ ์๋ ํ๋ผ๋ฏธํฐ ์ค ํ๋ ๋๋ n/a๋ฅผ ์ ํํ์ฌ ์๋ฌด๊ฒ๋ ์ง์ ํ์ง ์์ ์๋ ์๋ค. ํด๋น Config Rule์ ์ผ์ ๊ธฐ๊ฐ ๋ฏธ์ฌ์ฉํ๊ฑฐ๋ ํ์ฑํ๋ ์ก์ธ์ค ํค๊ฐ ์๋ IAM User๋ฅผ ์๋ณํ๊ธฐ ๋๋ฌธ์ Resource ID๋ IAM User์ ID๊ฐ ๋๋ฉฐ, ์ด๋ฅผ SSM Document์ IAMUserId ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก ์ ๋ฌํ๋ค. AutomationAssumeRole์๋ 3-3์์ ์์ฑํ IAM Role์ ARN์ ์ ๋ ฅํ๊ณ , SenderName์๋ ๋ฉ์ผ ๋ฐ์ ์ ์ด๋ฆ, SenderEmail์๋ 2-1์์ ์ธ์ฆ๋ฐ์ ๋ฐ์ ์ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ ๋ ฅํ๋ค.
5. ์์ฑ
์ด๋ก์จ ์ผ์ ๊ธฐ๊ฐ ๋ฏธ์ฌ์ฉ IAM ์ฌ์ฉ์์๊ฒ noti ๋ฉ์ผ ๋ฐ์ก ์๋ํ ์ฑ๊ณต~! ๐
๐ฐ ๋น์ฉ ๐ฐ
IAM ์ ์ ์ ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง SES๋ ์ 300๊ฑด ํ ์คํธ๋ก ๋ณด๋ธ๋ค๊ณ ํ์ ๋ 1๋ฌ๋ฌ ๋ฏธ๋ง์ผ๋ก ๋น์ฉ์ด ๊ณผ๊ธ๋ ๊ฒ์ผ๋ก ์์๋๊ณ
SSM Automation ์์ ๋น์ฉ ๋ํ 1๋ฌ๋ฌ ๋ฏธ๋ง์ผ๋ก ๋ฐ์ํ๋ค. (2023.07 ๊ธฐ์ค, AWS Cacluator ์ด์ฉ) SES + SSM๋ง ํฉ์ณ์๋ ์ 1๋ฌ๋ฌ ์ ๋๋ก ์ ๋ ดํ๊ฒ ์๋ํ ๊ตฌํ์ ์ฑ๊ณตํ์๋ค.
๐จ ์ ์ฝ ์ฌํญ ๐จ
๋ฐ์ ์ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ง์ ํ์์ผ๋, ์ค์ ๋ก ๋ฉ์ผ์ ๋ฐ์กํ๋ ์ฃผ์ฒด๋ AWS SES ์๋น์ค์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฉ์ผ ๋ฐ์ก์์ ๋๋ฉ์ธ์ด @amazonses.com ์ด ๋๋ค. ๋ฐ๋ผ์ ๋ฉ์ผ ์์ ์ธก์ ์ ์ฑ ์ ๋ฐ๋ผ ๋ฐ์ ์ ๋ณ์กฐ ์ฐจ๋จ ์ ์ฑ ์ผ๋ก ์คํธ ์ฒ๋ฆฌ๊ฐ ๋ ์ ์์ผ๋ฉฐ ๋๋ ์๋ ์บก์ฒ ํ๋ฉด๊ณผ ๊ฐ์ด ์ฃผ์ ๋ฌธ๊ตฌ๊ฐ ํจ๊ป ์ถ๋ ฅ๋๋ค.
์์์ ์ค๋ช ํ ์ ์ฒด ๋จ๊ณ๋ฅผ Cloudformation template ํ์ผ๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
ํ์ํ์ ๋ถ๋ค์ ์๋ yaml ํ์ผ์ ์ด์ฉํด ์์ฝ๊ฒ workflow๋ฅผ ๋ฐฐํฌํ์ ๋ ์ข์ต๋๋ค~๐
๐ ์ฐธ๊ณ ๋งํฌ
- AWS Docs: Evaluation Mode and Trigger Types for AWS Config Rules
- AWS Docs: Remediating Noncompliant Resources with AWS Config Rules
- AWS Docs: Amazon SES > ์ด๋ฉ์ผ ์ฃผ์ ์๊ฒฉ ์ฆ๋ช ์์ฑ
- AWS Docs: AWSConfigRemediation-DeleteIAMUser
- Boto3 Docs: IAM > Client > list_users
- Boto3 Docs: IAM > Client > list_user_tags
- AWS Docs: Moving out of the Amazon SES sandbox
- ๊ธฐ์ ๋ธ๋ก๊ทธ(LinkedIn) : AWS IAM Access keys rotation using Lambda function
- AWS Docs: AWS SDK๋ฅผ ์ฌ์ฉํ์ฌ Amazon SES๋ฅผ ํตํด ์ด๋ฉ์ผ ์ ์ก
- AWS Docs: Logging Automation action output with CloudWatch Logs