

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Kinesis Data Streams를 사용한 교차 계정 교차 리전 계정 수준 구독
<a name="CrossAccountSubscriptions-Kinesis-Account"></a>

교차 계정 구독을 생성할 때 단일 계정 또는 조직을 발신자로 지정할 수 있습니다. 조직을 지정하는 경우 이 절차를 통해 조직의 모든 계정에서 수신자 계정으로 로그를 보낼 수 있습니다.

계정에서 로그 데이터를 공유하려면 로그 데이터 발신자 및 수신자를 설정해야 합니다.
+ **로그 데이터 발신자** - 수신자로부터 대상 정보를 얻고 지정된 대상으로 로그 이벤트를 전송할 준비가 되었음을 CloudWatch Logs에 알립니다. 이 섹션의 나머지 부분에서는 가상 AWS 계정 번호가 111111111111인 로그 데이터 발신자가 표시됩니다.

  한 조직 내의 여러 계정에서 한 수신자 계정으로 로그를 보내려면 해당 조직의 모든 계정에서 수신자 계정으로 로그를 보낼 수 있는 권한을 부여하는 정책을 만들 수 있습니다. 각 발신자 계정에 대해 별도의 구독 필터를 설정해야 합니다.
+ **로그 데이터 수신자** - Amazon Kinesis Data Streams 스트림을 캡슐화하는 대상을 설정하고 CloudWatch Logs에 수신자가 로그 데이터를 수신하고 싶다는 사실을 알립니다. 그런 다음 수신자는 이 대상에 대한 정보를 발신자와 공유합니다. 이 섹션의 나머지 부분에서는 로그 데이터 수신자가 가상 AWS 계정 번호 999999999999로 표시됩니다.

교차 계정 사용자로부터 로그 이벤트 수신을 시작하기 위해 로그 데이터 수신자는 먼저 CloudWatch Logs 대상을 생성합니다. 각 대상은 다음과 같은 키 요소로 이루어져 있습니다.

**대상 이름**  
생성하고자 하는 대상의 이름.

**대상 ARN**  
구독 피드의 대상으로 사용할 리소스의 Amazon AWS 리소스 이름(ARN)입니다.

**역할 ARN**  
선택한 스트림에 데이터를 입력하는 데 필요한 권한을 CloudWatch Logs에 부여하는 AWS Identity and Access Management (IAM) 역할입니다.

**액세스 정책**  
대상에 쓰기 권한이 허용된 사용자들에게 적용되는 IAM 정책 문서(JSON 형식, IAM 정책 문법을 사용해 작성)입니다.

**참고**  
로그 그룹과 대상은 동일한 AWS 리전에 있어야 합니다. 그러나 대상이 가리키는 AWS 리소스는 다른 리전에 위치할 수 있습니다. 다음 섹션의 예제에서는 모든 리전 관련 리소스가 미국 동부(버지니아 북부)에서 생성됩니다.

**Topics**
+ [

# 새 교차 계정 구독 설정
](Cross-Account-Log_Subscription-New-Account.md)
+ [

# 기존 교차 계정 구독 업데이트
](Cross-Account-Log_Subscription-Update-Account.md)

# 새 교차 계정 구독 설정
<a name="Cross-Account-Log_Subscription-New-Account"></a>

이러한 섹션의 단계에 따라 새 교차 계정 로그 구독을 설정합니다.

**Topics**
+ [

# 1단계: 대상 생성
](CreateDestination-Account.md)
+ [

# 2단계: (조직을 사용하는 경우에만) IAM 역할 생성
](CreateSubscriptionFilter-IAMrole-Account.md)
+ [

# 3단계: 계정 수준 구독 필터 정책 생성
](CreateSubscriptionFilter-Account.md)
+ [

# 로그 이벤트의 흐름 검증
](ValidateLogEventFlow-Account.md)
+ [

# 런타임 시 대상 멤버십 수정
](ModifyDestinationMembership-Account.md)

# 1단계: 대상 생성
<a name="CreateDestination-Account"></a>

**중요**  
이 절차의 모든 단계는 로그 데이터 수신자 계정에서 수행되어야 합니다.

이 예제에서 로그 데이터 수신자 계정의 AWS 계정 ID는 999999999999이고 로그 데이터 발신자 AWS 계정 ID는 111111111111입니다.

 이 예제에서는 RecipientStream이라는 Amazon Kinesis Data Streams 스트림과 CloudWatch Logs가 데이터를 쓸 수 있는 역할을 사용하여 대상을 생성합니다.

대상이 생성되면 CloudWatch Logs는 수신자 계정을 대신하여 대상에게 테스트 메시지를 전송합니다. 구독 필터가 나중에 활성화되면 CloudWatch Logs는 소스 계정을 대신하여 대상에게 로그 이벤트를 보냅니다.

**대상을 생성하려면**

1. 수신자 계정에서 Amazon Kinesis Data Streams에 대상 스트림을 생성합니다. 명령 프롬프트에서 다음과 같이 입력합니다.

   ```
   aws kinesis create-stream --stream-name "RecipientStream" --shard-count 1
   ```

1. 스트림이 활성 상태가 될 때까지 기다립니다. **aws kinesis describe-stream** 명령을 사용하여 **StreamDescription.StreamStatus** 속성을 확인할 수 있습니다. 또한 CloudWatch Logs의 이후 단계에서 필요할 수 있기 때문에 **StreamDescription.StreamARN** 값을 기록해 둡니다.

   ```
   aws kinesis describe-stream --stream-name "RecipientStream"
   {
     "StreamDescription": {
       "StreamStatus": "ACTIVE",
       "StreamName": "RecipientStream",
       "StreamARN": "arn:aws:kinesis:us-east-1:999999999999:stream/RecipientStream",
       "Shards": [
         {
           "ShardId": "shardId-000000000000",
           "HashKeyRange": {
             "EndingHashKey": "34028236692093846346337460743176EXAMPLE",
             "StartingHashKey": "0"
           },
           "SequenceNumberRange": {
             "StartingSequenceNumber": "4955113521868881845667950383198145878459135270218EXAMPLE"
           }
         }
       ]
     }
   }
   ```

   스트림이 활성 상태가 될 때까지 1\$12분 정도 기다려야 할 수 있습니다.

1. 스트림에 데이터를 입력하는 데 필요한 권한을 CloudWatch Logs에 부여하는 IAM 역할을 생성합니다. 먼저 **\$1/TrustPolicyForCWL.json** 파일에서 신뢰 정책을 생성해야 합니다. 텍스트 편집기를 사용하여 이 정책 파일을 생성하고 IAM 콘솔은 사용하지 마세요.

   이 정책은 `sourceAccountId`를 지정하여 혼동된 대리자 보안 문제를 방지하는 데 도움이 되는 `aws:SourceArn` 글로벌 조건 컨텍스트 키를 포함합니다. 첫 번째 직접 호출에서 소스 계정 ID를 아직 모르는 경우 소스 ARN 필드에 대상 ARN을 넣는 것이 좋습니다. 후속 직접 호출에서는 소스 ARN을 첫 번째 직접 호출에서 수집한 실제 소스 ARN으로 설정해야 합니다. 자세한 내용은 [혼동된 대리자 방지](Subscriptions-confused-deputy.md) 단원을 참조하십시오.

   ```
   {
       "Statement": {
           "Effect": "Allow",
           "Principal": {
               "Service": "logs.amazonaws.com"
           },
           "Condition": {
               "StringLike": {
                   "aws:SourceArn": [
                       "arn:aws:logs:region:sourceAccountId:*",
                       "arn:aws:logs:region:recipientAccountId:*"
                   ]
               }
           },
           "Action": "sts:AssumeRole"
       }
   }
   ```

1. **aws iam create-role** 명령을 사용하여 신뢰 정책 파일을 지정하는 IAM 역할을 생성합니다. 이 또한 CloudWatch Logs의 이후 단계에서 필요할 수 있기 때문에 반환된 Role.Arn 값을 적어 둡니다.

   ```
   aws iam create-role \
   --role-name CWLtoKinesisRole \
   --assume-role-policy-document file://~/TrustPolicyForCWL.json
   
   {
       "Role": {
           "AssumeRolePolicyDocument": {
               "Statement": {
                   "Action": "sts:AssumeRole",
                   "Effect": "Allow",
                   "Condition": {
                       "StringLike": {
                           "aws:SourceArn": [
                               "arn:aws:logs:region:sourceAccountId:*",
                               "arn:aws:logs:region:recipientAccountId:*"
                           ]
                       }
                   },
                   "Principal": {
                       "Service": "logs.amazonaws.com"
                   }
               }
           },
           "RoleId": "AAOIIAH450GAB4HC5F431",
           "CreateDate": "2023-05-29T13:46:29.431Z",
           "RoleName": "CWLtoKinesisRole",
           "Path": "/",
           "Arn": "arn:aws:iam::999999999999:role/CWLtoKinesisRole"
       }
   }
   ```

1. CloudWatch Logs가 계정에서 수행할 수 있는 작업을 정의하는 권한 정책을 생성합니다. 먼저 텍스트 편집기를 사용하여 권한 정책을 **\$1/PermissionsForCWL.json** 파일로 생성합니다.

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "kinesis:PutRecord",
         "Resource": "arn:aws:kinesis:region:999999999999:stream/RecipientStream"
       }
     ]
   }
   ```

1. **aws iam put-role-policy** 명령을 사용하여 권한 정책을 역할에 연결합니다.

   ```
   aws iam put-role-policy \
       --role-name CWLtoKinesisRole \
       --policy-name Permissions-Policy-For-CWL \
       --policy-document file://~/PermissionsForCWL.json
   ```

1. 스트림이 활성 상태이고 IAM 역할을 생성하고 나면 CloudWatch Logs 대상을 생성할 수 있습니다.

   1. 이 단계를 수행해도 액세스 정책이 대상에 연결되는 것은 아니며, 대상 생성을 완료하기 위한 두 단계 중 첫 번째 단계를 완료한 것일 뿐입니다. 페이로드에 반환되는 **DestinationArn**을 적어둡니다.

      ```
      aws logs put-destination \
          --destination-name "testDestination" \
          --target-arn "arn:aws:kinesis:region:999999999999:stream/RecipientStream" \
          --role-arn "arn:aws:iam::999999999999:role/CWLtoKinesisRole"
      
      {
        "DestinationName" : "testDestination",
        "RoleArn" : "arn:aws:iam::999999999999:role/CWLtoKinesisRole",
        "DestinationArn" : "arn:aws:logs:us-east-1:999999999999:destination:testDestination",
        "TargetArn" : "arn:aws:kinesis:us-east-1:999999999999:stream/RecipientStream"
      }
      ```

   1. 7a 단계를 완료한 후 로그 데이터 수신자 계정에서 액세스 정책을 대상과 연결합니다. 이 정책은 **logs:PutSubscriptionFilter** 작업을 지정해야 하며, 발신자 계정에 대상에 액세스할 권한을 부여합니다.

      이 정책은 로그를 전송하는 AWS 계정에 권한을 부여합니다. 정책에서 이 계정 하나만 지정할 수 있으며, 또는 발신자 계정이 조직의 구성원인 경우 정책은 해당 조직의 조직 ID를 지정할 수 있습니다. 이렇게 하면 정책 하나만 생성하여 한 조직의 여러 계정이 이 대상 계정으로 로그를 보내도록 할 수 있습니다.

      텍스트 편집기를 사용하여 이름이 `~/AccessPolicy.json`이고 다음 정책 명령문 중 하나를 포함한 파일을 생성합니다.

      이 첫 번째 예제 정책은 ID가 `o-1234567890`인 조직의 모든 계정이 수신자 계정으로 로그를 보내도록 허용합니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "",
                  "Effect": "Allow",
                  "Principal": "*",
                  "Action": [
                      "logs:PutSubscriptionFilter",
                      "logs:PutAccountPolicy"
                  ],
                  "Resource": "arn:aws:logs:us-east-1:999999999999:destination:testDestination",
                  "Condition": {
                      "StringEquals": {
                          "aws:PrincipalOrgID": [
                              "o-1234567890"
                          ]
                      }
                  }
              }
          ]
      }
      ```

------

      다음 예에서는 로그 데이터 발신자 계정(111111111111)에서만 로그 데이터 수신자 계정으로 로그를 보내도록 허용합니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "",
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "111111111111"
                  },
                  "Action": [
                      "logs:PutSubscriptionFilter",
                      "logs:PutAccountPolicy"
                  ],
                  "Resource": "arn:aws:logs:us-east-1:999999999999:destination:testDestination"
              }
          ]
      }
      ```

------

   1. 이전 단계에서 생성한 정책을 대상에 연결합니다.

      ```
      aws logs put-destination-policy \
          --destination-name "testDestination" \
          --access-policy file://~/AccessPolicy.json
      ```

      이 액세스 정책을 사용하면 ID가 111111111111인 AWS 계정의 사용자가 ARN arn:aws:logs:region::destination:testDestination인 대상에 대해 **PutSubscriptionFilter**를 호출할 수 있습니다.**999999999999 testDestination 다른 사용자가 이 대상에 대해 PutSubscriptionFilter를 직접 호출하려는 시도는 모두 거부됩니다.

      액세스 정책에 대한 사용자 권한의 유효성을 검사하려면 *IAM 사용 설명서*의 [정책 검사기 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_policy-validator.html)을 참조하세요.

작업을 마쳤으면 교차 계정 권한 AWS Organizations 에를 사용하는 경우의 단계를 따릅니다[2단계: (조직을 사용하는 경우에만) IAM 역할 생성](CreateSubscriptionFilter-IAMrole-Account.md). Organizations를 사용하는 대신 다른 계정에 직접 권한을 부여하는 경우 해당 단계를 건너뛰고 [3단계: 계정 수준 구독 필터 정책 생성](CreateSubscriptionFilter-Account.md) 단계로 넘어갑니다.

# 2단계: (조직을 사용하는 경우에만) IAM 역할 생성
<a name="CreateSubscriptionFilter-IAMrole-Account"></a>

이전 섹션에서 `111111111111` 계정이 속한 조직에 권한을 부여하는 액세스 정책을 사용하여 대상을 생성한 경우 `111111111111` 계정에 직접 권한을 부여하는 대신 이 섹션의 단계를 따릅니다. 그렇지 않다면 [3단계: 계정 수준 구독 필터 정책 생성](CreateSubscriptionFilter-Account.md) 단계로 건너뛰어도 됩니다.

이 섹션의 단계에서는 CloudWatch가 수신자 대상에 대한 구독 필터를 생성할 수 있는 권한이 발신자 계정에 있는지를 가정하고 검증할 수 있는 IAM 역할을 생성합니다.

발신자 계정에서 이 섹션의 단계를 수행합니다. 역할은 발신자 계정에 있어야 하며 구독 필터에서 이 역할의 ARN을 지정합니다. 이 예제에서 발신자 계정은 `111111111111`입니다.

**를 사용하여 교차 계정 로그 구독에 필요한 IAM 역할을 생성하려면 AWS Organizations**

1. `/TrustPolicyForCWLSubscriptionFilter.json` 파일에 다음 트러스트 정책을 생성합니다. 텍스트 편집기를 사용하여 이 정책 파일을 생성하고, IAM 콘솔은 사용하지 마세요.

   ```
   {
     "Statement": {
       "Effect": "Allow",
       "Principal": { "Service": "logs.amazonaws.com" },
       "Action": "sts:AssumeRole"
     }
   }
   ```

1. 이 정책을 사용하는 IAM 역할을 생성합니다. 명령에 의해 반환되는 `Arn` 값은 이 절차의 뒷부분에 필요하므로 메모해 둡니다. 이 예제에서 생성하는 역할의 이름으로는 `CWLtoSubscriptionFilterRole`을 사용합니다.

   ```
   aws iam create-role \ 
        --role-name CWLtoSubscriptionFilterRole \ 
        --assume-role-policy-document file://~/TrustPolicyForCWLSubscriptionFilter.json
   ```

1. CloudWatch Logs가 계정에서 수행할 수 있는 작업을 정의하는 권한 정책을 생성합니다.

   1. 먼저 텍스트 편집기를 사용하여 다음 권한 정책을 이름이 `~/PermissionsForCWLSubscriptionFilter.json`인 파일로 생성합니다.

      ```
      { 
          "Statement": [ 
              { 
                  "Effect": "Allow", 
                  "Action": "logs:PutLogEvents", 
                  "Resource": "arn:aws:logs:region:111111111111:log-group:LogGroupOnWhichSubscriptionFilterIsCreated:*" 
              } 
          ] 
      }
      ```

   1. 다음 명령을 입력하여 방금 생성한 권한 정책을 2단계에서 생성한 역할에 연결합니다.

      ```
      aws iam put-role-policy  
          --role-name CWLtoSubscriptionFilterRole  
          --policy-name Permissions-Policy-For-CWL-Subscription-filter 
          --policy-document file://~/PermissionsForCWLSubscriptionFilter.json
      ```

작업을 마쳤으면 [3단계: 계정 수준 구독 필터 정책 생성](CreateSubscriptionFilter-Account.md) 단계로 넘어갑니다.

# 3단계: 계정 수준 구독 필터 정책 생성
<a name="CreateSubscriptionFilter-Account"></a>

대상을 생성하고 나면 로그 데이터 수신자 계정에서 다른 AWS 계정이 로그 이벤트를 동일한 대상으로 전송할 수 있도록 대상 ARN(arn:aws:logs:us-east-1:999999999999:destination:testDestination)을 이들과 공유할 수 있습니다. 그러면 이러한 다른 전송 계정 사용자는 이 대상에 해당되는 로그 그룹에 대한 구독 필터를 생성합니다. 그 즉시 구독 필터는 실시간으로 선택한 로그 그룹에서 지정된 스트림으로 로그 데이터를 이동시키기 시작합니다.

**참고**  
전체 조직에 구독 필터에 대한 권한을 부여하는 경우 [2단계: (조직을 사용하는 경우에만) IAM 역할 생성](CreateSubscriptionFilter-IAMrole-Account.md)에서 생성한 IAM 역할의 ARN을 사용해야 합니다.

다음 예제에서는 전송 계정에 계정 수준 구독 필터 정책이 생성됩니다. 필터는 발신자 계정 `111111111111`과 연결되어 필터 및 선택 기준과 일치하는 모든 로그 이벤트가 이전에 생성한 대상으로 전달됩니다. 이 대상에서는 'RecipientStream'이라는 스트림을 캡슐화합니다.

`selection-criteria` 필드는 선택 사항이지만 구독 필터에서 무한 로그 재귀를 일으킬 수 있는 로그 그룹을 제외하는 데 중요합니다. 이 문제 및 제외할 로그 그룹 결정에 대한 자세한 내용은 [로그 재귀 방지](Subscriptions-recursion-prevention.md)을 참조하세요. 현재 NOT IN은 `selection-criteria`에 지원되는 유일한 연산자입니다.

```
aws logs put-account-policy \
    --policy-name "CrossAccountStreamsExamplePolicy" \
    --policy-type "SUBSCRIPTION_FILTER_POLICY" \
    --policy-document '{"DestinationArn":"arn:aws:logs:region:999999999999:destination:testDestination", "FilterPattern": "", "Distribution": "Random"}' \
    --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \
    --scope "ALL"
```

발신자 계정의 로그 그룹과 대상은 동일한 AWS 리전에 있어야 합니다. 그러나 대상은 다른 리전에 있는 Amazon Kinesis Data Streams 스트림과 같은 AWS 리소스를 가리킬 수 있습니다.

# 로그 이벤트의 흐름 검증
<a name="ValidateLogEventFlow-Account"></a>

계정 수준 구독 필터 정책을 생성하고 나면 CloudWatch Logs가 모든 수신 로그 이벤트 중에서 필터 패턴 및 선택 기준과 일치하는 이벤트를 "**RecipientStream**"이라는 대상 스트림 내에서 캡슐화된 스트림으로 전달합니다. 대상 소유자는 **aws kinesis get-shard-iterator** 명령을 사용하여 Amazon Kinesis Data Streams 샤드를 캡처하고 **aws kinesis get-records** 명령을 사용하여 일부 Amazon Kinesis Data Streams 레코드를 가져와서이 문제가 발생하고 있는지 확인할 수 있습니다.

```
aws kinesis get-shard-iterator \
      --stream-name RecipientStream \
      --shard-id shardId-000000000000 \
      --shard-iterator-type TRIM_HORIZON

{
    "ShardIterator":
    "AAAAAAAAAAFGU/kLvNggvndHq2UIFOw5PZc6F01s3e3afsSscRM70JSbjIefg2ub07nk1y6CDxYR1UoGHJNP4m4NFUetzfL+wev+e2P4djJg4L9wmXKvQYoE+rMUiFq+p4Cn3IgvqOb5dRA0yybNdRcdzvnC35KQANoHzzahKdRGb9v4scv+3vaq+f+OIK8zM5My8ID+g6rMo7UKWeI4+IWiKEXAMPLE"
}

aws kinesis get-records \
      --limit 10 \
      --shard-iterator
      "AAAAAAAAAAFGU/kLvNggvndHq2UIFOw5PZc6F01s3e3afsSscRM70JSbjIefg2ub07nk1y6CDxYR1UoGHJNP4m4NFUetzfL+wev+e2P4djJg4L9wmXKvQYoE+rMUiFq+p4Cn3IgvqOb5dRA0yybNdRcdzvnC35KQANoHzzahKdRGb9v4scv+3vaq+f+OIK8zM5My8ID+g6rMo7UKWeI4+IWiKEXAMPLE"
```

**참고**  
Amazon Kinesis Data Streams가 데이터를 반환하기 전에 `get-records` 명령을 몇 번 다시 실행해야 할 수 있습니다.

Amazon Kinesis Data Streams 레코드 배열이 포함된 응답이 표시됩니다. Amazon Kinesis Data Streams 레코드의 데이터 속성은 gzip 형식으로 압축된 다음 base64로 인코딩됩니다. 다음 Unix 명령을 사용하여 명령 줄에서 원시 데이터를 검토할 수 있습니다.

```
echo -n "<Content of Data>" | base64 -d | zcat
```

디코딩 및 압축 해제된 base64 데이터는 다음 구조를 가진 JSON으로 포맷됩니다.

```
{
    "owner": "111111111111",
    "logGroup": "CloudTrail/logs",
    "logStream": "111111111111_CloudTrail/logs_us-east-1",
    "subscriptionFilters": [
        "RecipientStream"
    ],
    "messageType": "DATA_MESSAGE",
    "logEvents": [
        {
            "id": "3195310660696698337880902507980421114328961542429EXAMPLE",
            "timestamp": 1432826855000,
            "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
        },
        {
            "id": "3195310660696698337880902507980421114328961542429EXAMPLE",
            "timestamp": 1432826855000,
            "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
        },
        {
            "id": "3195310660696698337880902507980421114328961542429EXAMPLE",
            "timestamp": 1432826855000,
            "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
        }
    ]
}
```

데이터 구조에서 키 요소는 다음과 같습니다.

**messageType**  
데이터 메시지는 'DATA\$1MESSAGE' 유형을 사용합니다. CloudWatch Logs는 주로 대상에 연결할 수 있는지 확인하기 위해 "CONTROL\$1MESSAGE" 유형의 Amazon Kinesis Data Streams 레코드를 내보낼 수 있습니다.

**owner**  
발신 로그 데이터의 AWS 계정 ID입니다.

**logGroup**  
원본 로그 데이터의 로그 그룹 이름.

**logStream**  
원본 로그 데이터의 로그 스트림 이름.

**subscriptionFilters**  
원본 로그 데이터과 일치한 구독 필터 이름 목록입니다.

**logEvents**  
로그 이벤트 레코드의 배열로 표현되는 실제 로그 데이터. 'ID' 속성은 모든 로그 이벤트의 고유 식별자입니다.

**policyLevel**  
정책이 적용된 수준. 'ACCOUNT\$1LEVEL\$1POLICY'는 계정 수준 구독 필터 정책의 `policyLevel`입니다.

# 런타임 시 대상 멤버십 수정
<a name="ModifyDestinationMembership-Account"></a>

소유된 대상에서 몇몇 사용자의 멤버십을 추가 또는 제거해야 하는 상황에 직면할 수 있습니다. 새 액세스 정책과 함께 대상에 `put-destination-policy` 명령을 사용할 수 있습니다. 다음 예제에서는 이전에 추가한 계정인 **111111111111**이 추가적인 로그 데이터 전송을 중단하고 계정 **222222222222**가 활성화됩니다.

1. 대상 **testDestination**에 현재 연결된 정책을 가져와서 **AccessPolicy**를 적어둡니다.

   ```
   aws logs describe-destinations \
       --destination-name-prefix "testDestination"
   
   {
    "Destinations": [
      {
        "DestinationName": "testDestination",
        "RoleArn": "arn:aws:iam::999999999999:role/CWLtoKinesisRole",
        "DestinationArn": "arn:aws:logs:region:999999999999:destination:testDestination",
        "TargetArn": "arn:aws:kinesis:region:999999999999:stream/RecipientStream",
        "AccessPolicy": "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Sid\": \"\", \"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"111111111111\"}, \"Action\": \"logs:PutSubscriptionFilter\", \"Resource\": \"arn:aws:logs:region:999999999999:destination:testDestination\"}] }"
      }
    ]
   }
   ```

1. 계정 **111111111111**이 중단되고 계정 **222222222222**가 활성화되었음을 반영하도록 이 정책을 업데이트합니다. **\$1/NewAccessPolicy.json** 파일에 이 정책을 저장합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "222222222222"
               },
               "Action": [
                   "logs:PutSubscriptionFilter",
                   "logs:PutAccountPolicy"
               ],
               "Resource": "arn:aws:logs:us-east-1:999999999999:destination:testDestination"
           }
       ]
   }
   ```

------

1. **PutDestinationPolicy**를 직접 호출하여 **NewAccessPolicy.json** 파일에 정의된 정책을 대상에 연결합니다.

   ```
   aws logs put-destination-policy \
   --destination-name "testDestination" \
   --access-policy file://~/NewAccessPolicy.json
   ```

   이렇게 하면 계정 ID **111111111111**에서 로그 이벤트가 비활성화됩니다. 계정 ID **222222222222**에서 나온 로그 이벤트는 계정 **222222222222** 의 소유자가 구독 필터를 생성하고 나면 그 즉시 대상으로 이동하기 시작합니다.

# 기존 교차 계정 구독 업데이트
<a name="Cross-Account-Log_Subscription-Update-Account"></a>

현재 대상 계정이 특정 발신자 계정에만 권한을 부여하는 교차 계정 로그 구독이 있고 대상 계정이 조직의 모든 계정에 대한 액세스 권한을 부여하도록 이 구독을 업데이트하려는 경우 이 섹션의 단계를 따릅니다.

**Topics**
+ [

# 1단계: 구독 필터 업데이트
](Cross-Account-Log_Subscription-Update-filter-Account.md)
+ [

# 2단계: 기존 대상 액세스 정책 업데이트
](Cross-Account-Log_Subscription-Update-policy-Account.md)

# 1단계: 구독 필터 업데이트
<a name="Cross-Account-Log_Subscription-Update-filter-Account"></a>

**참고**  
이 단계는 [AWS 서비스에서 로깅 활성화](AWS-logs-and-resource-policy.md)에 나열된 서비스에서 생성된 로그에 대한 교차 계정 구독에만 필요합니다. 해당 로그 그룹 중 하나에서 생성된 로그로 작업하지 않는 경우 [2단계: 기존 대상 액세스 정책 업데이트](Cross-Account-Log_Subscription-Update-policy-Account.md) 섹션으로 건너뛸 수 있습니다.

경우에 따라 대상 계정으로 로그를 보내는 모든 발신자 계정의 구독 필터를 업데이트해야 합니다. 업데이트에는 IAM 역할이 추가됩니다. IAM 역할은 CloudWatch에서 발신자 계정이 수신자 계정에 로그를 보낼 수 있는 권한이 있는지를 가정하고 검증할 수 있습니다.

교차 계정 구독 권한에 대해 조직 ID를 사용하도록 업데이트하려는 모든 발신자 계정에 대해서는 이 섹션의 단계를 따릅니다.

이 섹션의 예제에서 두 개의 `111111111111` 계정 및 `222222222222` 계정은 `999999999999` 계정에 로그를 전송하기 위해 생성된 구독 필터를 이미 가지고 있습니다. 기존 구독 필터 값은 다음과 같습니다.

```
## Existing Subscription Filter parameter values
{
    "DestinationArn": "arn:aws:logs:region:999999999999:destination:testDestination",
    "FilterPattern": "{$.userIdentity.type = Root}",
    "Distribution": "Random"
}
```

현재 구독 필터 파라미터 값을 찾아야 하는 경우 다음 명령을 입력합니다.

```
aws logs describe-account-policies \
--policy-type "SUBSCRIPTION_FILTER_POLICY" \
--policy-name "CrossAccountStreamsExamplePolicy"
```

**교차 계정 로그 권한에 대한 조직 ID 사용을 시작하도록 구독 필터 업데이트**

1. `~/TrustPolicyForCWL.json` 파일에 다음 트러스트 정책을 생성합니다. 텍스트 편집기를 사용하여 이 정책 파일을 생성하고, IAM 콘솔은 사용하지 마세요.

   ```
   {
     "Statement": {
       "Effect": "Allow",
       "Principal": { "Service": "logs.amazonaws.com" },
       "Action": "sts:AssumeRole"
     }
   }
   ```

1. 이 정책을 사용하는 IAM 역할을 생성합니다. 명령에 의해 반환되는 `Arn` 값의 `Arn` 값은 이 절차의 뒷부분에 필요하므로 메모해 둡니다. 이 예제에서 생성하는 역할의 이름으로는 `CWLtoSubscriptionFilterRole`을 사용합니다.

   ```
   aws iam create-role 
       \ --role-name CWLtoSubscriptionFilterRole 
       \ --assume-role-policy-document file://~/TrustPolicyForCWL.json
   ```

1. CloudWatch Logs가 계정에서 수행할 수 있는 작업을 정의하는 권한 정책을 생성합니다.

   1. 먼저 텍스트 편집기를 사용하여 다음 권한 정책을 이름이 `/PermissionsForCWLSubscriptionFilter.json`인 파일로 생성합니다.

      ```
      { 
          "Statement": [ 
              { 
                  "Effect": "Allow", 
                  "Action": "logs:PutLogEvents", 
                  "Resource": "arn:aws:logs:region:111111111111:log-group:LogGroupOnWhichSubscriptionFilterIsCreated:*" 
              } 
          ] 
      }
      ```

   1. 다음 명령을 입력하여 방금 생성한 권한 정책을 2단계에서 생성한 역할에 연결합니다.

      ```
      aws iam put-role-policy 
          --role-name CWLtoSubscriptionFilterRole 
          --policy-name Permissions-Policy-For-CWL-Subscription-filter 
          --policy-document file://~/PermissionsForCWLSubscriptionFilter.json
      ```

1. 다음 명령을 입력하여 구독 필터 정책을 업데이트합니다.

   ```
   aws logs put-account-policy \
       --policy-name "CrossAccountStreamsExamplePolicy" \
       --policy-type "SUBSCRIPTION_FILTER_POLICY" \
       --policy-document '{"DestinationArn":"arn:aws:logs:region:999999999999:destination:testDestination", "FilterPattern": "{$.userIdentity.type = Root}", "Distribution": "Random"}' \
       --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \
       --scope "ALL"
   ```

# 2단계: 기존 대상 액세스 정책 업데이트
<a name="Cross-Account-Log_Subscription-Update-policy-Account"></a>

모든 발신자 계정에서 구독 필터를 업데이트한 후, 수신자 계정에서 대상 액세스 정책을 업데이트할 수 있습니다.

다음 예제에서 수신자 계정은 `999999999999`이며 대상의 이름은 `testDestination`입니다.

업데이트를 통해 ID가 `o-1234567890`인 조직의 모든 계정이 수신자 계정으로 로그를 보낼 수 있습니다. 구독 필터가 생성된 계정만이 실제로 수신자 계정에 로그를 보냅니다.

**수신자 계정의 대상 액세스 정책을 업데이트하여 권한에 대한 조직 ID 사용**

1. 수신자 계정에서 텍스트 편집기를 사용하여 다음 내용을 포함한 `~/AccessPolicy.json` 파일을 생성합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "",
               "Effect": "Allow",
               "Principal": "*",
               "Action": [
                   "logs:PutSubscriptionFilter",
                   "logs:PutAccountPolicy"
               ],
               "Resource": "arn:aws:logs:us-east-1:999999999999:destination:testDestination",
               "Condition": {
                   "StringEquals": {
                       "aws:PrincipalOrgID": [
                           "o-1234567890"
                       ]
                   }
               }
           }
       ]
   }
   ```

------

1. 다음 명령을 입력하여 방금 생성한 정책을 기존 대상에 연결합니다. 특정 AWS 계정 ID를 나열하는 액세스 정책 대신 조직 IDs로 액세스 정책을 사용하도록 대상을 업데이트하려면 `force` 파라미터를 포함합니다.
**주의**  
에 나열된 AWS 서비스에서 전송한 로그로 작업[AWS 서비스에서 로깅 활성화](AWS-logs-and-resource-policy.md)하는 경우이 단계를 수행하기 전에 먼저에 설명된 대로 모든 발신자 계정의 구독 필터를 업데이트해야 합니다[1단계: 구독 필터 업데이트](Cross-Account-Log_Subscription-Update-filter-Account.md).

   ```
   aws logs put-destination-policy 
       \ --destination-name "testDestination" 
       \ --access-policy file://~/AccessPolicy.json
       \ --force
   ```