

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

# 에서 명명된 규칙 블록 구성 AWS CloudFormation Guard
<a name="named-rule-block-composition"></a>

를 사용하여 명명된 규칙 블록을 작성할 때 다음 두 가지 구성 스타일을 사용할 AWS CloudFormation Guard수 있습니다.
+ 조건부 종속성
+ 상관관계 종속성

이러한 종속성 구성 스타일 중 하나를 사용하면 재사용 가능성을 높이고 명명된 규칙 블록의 세부 정보 및 반복을 줄일 수 있습니다.

**Topics**
+ [사전 조건](#named-rules-prerequisites)
+ [조건부 종속성 구성](#named-rules-conditional-dependency)
+ [상관관계 종속성 구성](#named-rules-correlational-dependency)

## 사전 조건
<a name="named-rules-prerequisites"></a>

[쓰기 규칙](writing-rules.md#named-rule-blocks)의 명명된 규칙 블록에 대해 알아봅니다.

## 조건부 종속성 구성
<a name="named-rules-conditional-dependency"></a>

이러한 구성 스타일에서 `when` 블록 또는 명명된 규칙 블록의 평가는 하나 이상의 다른 명명된 규칙 블록 또는 절의 평가 결과에 조건부로 종속됩니다. 다음 예제 Guard 규칙 파일에는 조건부 종속성을 보여주는 명명된 규칙 블록이 포함되어 있습니다.

```
# Named-rule block, rule_name_A
rule rule_name_A {
    Guard_rule_1
    Guard_rule_2
    ...
}

# Example-1, Named-rule block, rule_name_B, takes a conditional dependency on rule_name_A
rule rule_name_B when rule_name_A {
    Guard_rule_3
    Guard_rule_4
    ...
}

# Example-2, when block takes a conditional dependency on rule_name_A
when rule_name_A {
    Guard_rule_3
    Guard_rule_4
    ...
}

# Example-3, Named-rule block, rule_name_C, takes a conditional dependency on rule_name_A ^ rule_name_B
rule rule_name_C when rule_name_A
                      rule_name_B {
    Guard_rule_3
    Guard_rule_4
    ...
}

# Example-4, Named-rule block, rule_name_D, takes a conditional dependency on (rule_name_A v clause_A) ^ clause_B ^ rule_name_B
rule rule_name_D when rule_name_A OR
                      clause_A
                      clause_B
                      rule_name_B {
    Guard_rule_3
    Guard_rule_4
    ...
}
```

앞의 예제 규칙 파일에서 `Example-1`의 가능한 결과는 다음과 같습니다.
+ 가 로 `rule_name_A` 평가되면 `PASS`에 의해 캡슐화된 Guard 규칙이 평가`rule_name_B`됩니다.
+ 가 로 `rule_name_A` 평가되면 `FAIL`에 의해 캡슐화된 Guard 규칙`rule_name_B`은 평가되지 않습니다.는 로 `rule_name_B` 평가됩니다`SKIP`.
+ 가 로 `rule_name_A` 평가되면 `SKIP`에 의해 캡슐화된 Guard 규칙`rule_name_B`은 평가되지 않습니다.는 로 `rule_name_B` 평가됩니다`SKIP`.
**참고**  
이 사례는가 로 평가`FAIL`되고가 로 `rule_name_A` 평가되는 규칙에 `rule_name_A` 조건부로 종속되는 경우에 발생합니다`SKIP`.

다음은 수신 및 송신 보안 그룹 정보를 위한 항목의 구성 관리 데이터베이스(CMDB) 구성 AWS Config 항목의 예입니다. 이 예제에서는 조건부 종속성 구성을 보여줍니다.

```
rule check_resource_type_and_parameter {
    resourceType == /AWS::EC2::SecurityGroup/
    InputParameters.TcpBlockedPorts NOT EMPTY 
}

rule check_parameter_validity when check_resource_type_and_parameter {
    InputParameters.TcpBlockedPorts[*] {
        this in r[0,65535] 
    }
}

rule check_ip_procotol_and_port_range_validity when check_parameter_validity {
    let ports = InputParameters.TcpBlockedPorts[*]

    # 
    # select all ipPermission instances that can be reached by ANY IP address
    # IPv4 or IPv6 and not UDP
    #
    let configuration = configuration.ipPermissions[ 
        some ipv4Ranges[*].cidrIp == "0.0.0.0/0" or
        some ipv6Ranges[*].cidrIpv6 == "::/0"
        ipProtocol != 'udp' ] 
    when %configuration !empty {
        %configuration {
            ipProtocol != '-1'

            when fromPort exists 
                toPort exists {
                let ip_perm_block = this
                %ports {
                    this < %ip_perm_block.fromPort or
                    this > %ip_perm_block.toPort
                }
            }
        }
    }
}
```

앞의 예에서 `check_parameter_validity`는에 조건부로 종속`check_resource_type_and_parameter`되고 `check_ip_procotol_and_port_range_validity`는에 조건부로 종속됩니다`check_parameter_validity`. 다음은 이전 규칙을 준수하는 구성 관리 데이터베이스(CMDB) 구성 항목입니다.

```
---
version: '1.3'
resourceType: 'AWS::EC2::SecurityGroup'
resourceId: sg-12345678abcdefghi
configuration:
  description: Delete-me-after-testing
  groupName: good-sg-test-delete-me
  ipPermissions:
    - fromPort: 172
      ipProtocol: tcp
      ipv6Ranges: []
      prefixListIds: []
      toPort: 172
      userIdGroupPairs: []
      ipv4Ranges:
        - cidrIp: 0.0.0.0/0
      ipRanges:
        - 0.0.0.0/0
    - fromPort: 89
      ipProtocol: tcp
      ipv6Ranges:
        - cidrIpv6: '::/0'
      prefixListIds: []
      toPort: 89
      userIdGroupPairs: []
      ipv4Ranges:
        - cidrIp: 0.0.0.0/0
      ipRanges:
        - 0.0.0.0/0
  ipPermissionsEgress:
    - ipProtocol: '-1'
      ipv6Ranges: []
      prefixListIds: []
      userIdGroupPairs: []
      ipv4Ranges:
        - cidrIp: 0.0.0.0/0
      ipRanges:
        - 0.0.0.0/0
  tags:
    - key: Name
      value: good-sg-delete-me
  vpcId: vpc-0123abcd
InputParameters:
  TcpBlockedPorts:
    - 3389
    - 20
    - 110
    - 142
    - 1434
    - 5500
supplementaryConfiguration: {}
resourceTransitionStatus: None
```

## 상관관계 종속성 구성
<a name="named-rules-correlational-dependency"></a>

이러한 구성 스타일에서 `when` 블록 또는 명명된 규칙 블록의 평가는 하나 이상의 다른 Guard 규칙의 평가 결과에 상관 관계가 있습니다. 다음과 같이 상관관계 종속성을 달성할 수 있습니다.

```
# Named-rule block, rule_name_A, takes a correlational dependency on all of the Guard rules encapsulated by the named-rule block
rule rule_name_A {
    Guard_rule_1
    Guard_rule_2
    ...
}

# when block takes a correlational dependency on all of the Guard rules encapsulated by the when block
when condition {
    Guard_rule_1
    Guard_rule_2
    ...
}
```

상관관계 종속성 구성을 이해하는 데 도움이 되도록 Guard 규칙 파일의 다음 예제를 검토하세요.

```
#
# Allowed valid protocols for AWS::ElasticLoadBalancingV2::Listener resources
#
let allowed_protocols = [ "HTTPS", "TLS" ]

let elbs = Resources.*[ Type == 'AWS::ElasticLoadBalancingV2::Listener' ]

#
# If there are AWS::ElasticLoadBalancingV2::Listener resources present, ensure that they have protocols specified from the 
# list of allowed protocols and that the Certificates property is not empty
#
rule ensure_all_elbs_are_secure when %elbs !empty {
    %elbs.Properties {
        Protocol in %allowed_protocols
        Certificates !empty
    }
}

# 
# In addition to secure settings, ensure that AWS::ElasticLoadBalancingV2::Listener resources are private
#
rule ensure_elbs_are_internal_and_secure when %elbs !empty {
    ensure_all_elbs_are_secure
    %elbs.Properties.Scheme == 'internal'
}
```

앞의 규칙 파일에서 `ensure_elbs_are_internal_and_secure`는에 대한 상관관계 종속성이 있습니다`ensure_all_elbs_are_secure`. 다음은 이전 규칙을 준수하는 CloudFormation 템플릿의 예입니다.

```
Resources:
  ServiceLBPublicListener46709EAA:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      Scheme: internal
      Protocol: HTTPS
      Certificates:
        - CertificateArn: 'arn:aws:acm...'
  ServiceLBPublicListener4670GGG:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      Scheme: internal
      Protocol: HTTPS
      Certificates:
        - CertificateArn: 'arn:aws:acm...'
```