스택 리소스에 대한 업데이트 방지 - AWS CloudFormation

스택 리소스에 대한 업데이트 방지

스택을 생성할 때 모든 리소스에 대한 모든 업데이트 작업이 허용됩니다. 기본적으로 스택 업데이트 권한이 있는 사용자는 스택에서 모든 리소스를 업데이트할 수 있습니다. 업데이트 중에 일부 리소스를 중단하거나 완전히 교체하여 새로운 물리적 ID 또는 완전히 새로운 스토리지를 생성해야 할 수 있습니다. 스택 정책을 사용하여 스택 업데이트 중에 스택 리소스를 실수로 업데이트하거나 삭제하는 것을 방지할 수 있습니다. 스택 정책은 지정된 리소스에 대해 수행할 수 있는 업데이트 작업을 정의하는 JSON 문서입니다.

스택 정책을 설정한 이후에는 기본적으로 스택 내의 모든 리소스가 보호됩니다. 특정 리소스에 대한 업데이트를 허용하려면 스택 정책에서 해당 리소스에 대해 명시적 Allow 문을 지정합니다. 스택 정책을 스택당 하나만 정의할 수 있지만, 단일 정책에서 여러 리소스를 보호할 수 있습니다. 스택 정책은 스택을 업데이트하려 하는 모든 AWS CloudFormation 사용자에게 적용됩니다. 다른 스택 정책을 다른 사용자와 연결할 수 없습니다.

스택 정책은 스택 업데이트 중에만 적용됩니다. AWS Identity and Access Management(IAM) 정책처럼 액세스 제어를 제공하지 않습니다. 스택 정책을 안전 메커니즘으로만 사용하여 특정 스택 리소스가 실수로 업데이트되는 것을 방지하십시오. AWS 리소스 또는 작업에 대한 액세스를 제어하려면 IAM을 사용합니다.

예제 스택 정책

다음은 ProductionDatabase 리소스에 대한 업데이트를 방지하는 예제 스택 정책입니다.

{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" }, { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "LogicalResourceId/ProductionDatabase" } ] }

스택 정책을 설정한 경우 기본적으로 모든 리소스가 보호됩니다. 모든 리소스에 대한 업데이트를 허용하려면 모든 리소스에 대해 모든 작업을 허용하는 Allow 문을 추가합니다. Allow 문은 모든 리소스를 지정하지만 명시적 Deny 문은 ProductionDatabase 논리적 ID를 가진 리소스에 대해 해당 문을 무시합니다. 이 Deny 문은 ProductionDatabase 리소스에 대한 모든 업데이트 작업(예: 대체 또는 삭제)를 금지합니다.

Principal 요소는 필수이지만 와일드카드(*)만 지원합니다. 즉, 문이 모든 보안 주체에 적용됩니다.

참고

스택 업데이트 중에 AWS CloudFormation에서는 다른 업데이트된 리소스에 종속되는 리소스를 자동으로 업데이트합니다. 예를 들어, AWS CloudFormation은 업데이트된 리소스를 참조하는 리소스를 업데이트합니다. AWS CloudFormation에서는 자동으로 업데이트된 리소스를 물리적으로 변경하지 않지만(예: 리소스의 ID), 스택 정책이 해당 리소스와 연결되어 있는 경우 해당 리소스를 업데이트할 권한이 있어야 합니다.

스택 정책 정의

스택을 생성할 때에는 스택 정책이 설정되어 있지 않으므로 모든 리소스에 대한 모든 업데이트 작업이 허용됩니다. 스택 리소스를 업데이트 작업으로부터 보호하려면 스택 정책을 정의한 다음 스택에 대해 해당 정책을 설정합니다. 스택 정책은 AWS CloudFormation 사용자가 수행할 수 있는 AWS CloudFormation 스택 업데이트 작업과 작업이 적용되는 리소스를 정의하는 JSON 문서입니다. 스택을 생성할 때 스택 정책을 포함하는 텍스트 파일을 지정하거나 입력하여 스택 정책을 설정합니다. 스택에 대한 스택 정책을 설정하는 경우 명시적으로 허용되지 않는 업데이트는 기본적으로 거부됩니다.

Effect, Action, Principal, Resource, Condition의 다섯 가지 요소를 사용하여 스택 정책을 정의합니다. 다음은 의사(pseudo) 코드는 스택 정책 구문을 보여줍니다.

{ "Statement" : [ { "Effect" : "Deny_or_Allow", "Action" : "update_actions", "Principal" : "*", "Resource" : "LogicalResourceId/resource_logical_ID", "Condition" : { "StringEquals_or_StringLike" : { "ResourceType" : [resource_type, ...] } } } ] }
Effect

지정한 리소스에 대해 지정한 작업을 거부할지 허용할지 여부를 결정합니다. Deny 또는 Allow만 지정할 수 있습니다(예: ).

"Effect" : "Deny"
중요

스택 정책에 중복 문(리소스에 대한 업데이트 허용 및 거부)이 포함되어 있는 경우 항상 Deny 문이 Allow 문보다 우선합니다. 리소스를 보호하려면 해당 리소스에 대해 Deny 문을 사용합니다.

작업

거부되거나 허용되는 업데이트 작업을 지정합니다.

Update:Modify

변경 사항을 적용하는 동안 리소스 중단이 발생하지 않거나 일부 중단될 수 있는 업데이트 작업을 지정합니다. 모든 리소스는 물리적 ID를 유지합니다.

Update:Replace

도중에 리소스가 다시 생성되는 업데이트 작업을 지정합니다. AWS CloudFormation에서는 지정된 업데이트를 사용하여 새로운 리소스를 생성한 다음 이전 리소스를 삭제합니다. 리소스가 다시 생성되므로 새 리소스의 물리적 ID가 달라질 수 있습니다.

Update:Delete

도중에 리소스가 제거되는 업데이트 작업을 지정합니다. 스택 템플릿에서 리소스를 완전히 제거하는 업데이트의 경우 이 작업이 필요합니다.

업데이트:*

모든 업데이트 작업을 지정합니다. 별표는 모든 업데이트 작업을 나타내는 와일드카드입니다.

다음 예에서는 대체 및 삭제 작업을 지정하는 방법을 보여줍니다.

"Action" : ["Update:Replace", "Update:Delete"]

하나를 제외한 모든 업데이트 작업을 허용하려면 NotAction을 사용합니다. 예를 들어, Update:Delete를 제외한 모든 업데이트 작업을 허용하려면 이 예제와 같이 NotAction을 사용합니다.

{ "Statement" : [ { "Effect" : "Allow", "NotAction" : "Update:Delete", "Principal": "*", "Resource" : "*" } ] }

스택 업데이트에 대한 자세한 내용은 AWS CloudFormation 스택 업데이트 단원을 참조하십시오.

보안 주체

Principal 요소는 정책이 적용되는 개체를 지정합니다. 이 요소는 필수이지만 와일드카드(*)만 지원합니다. 즉, 정책이 모든 보안 주체에 적용됩니다.

Resource

정책이 적용되는 리소스의 논리적 ID를 지정합니다. 리소스 유형을 지정하려면 Condition 요소를 사용합니다.

단일 리소스를 지정하려면 논리적 ID를 사용합니다. 예제:

"Resource" : ["LogicalResourceId/myEC2instance"]

와일드카드를 논리적 ID와 함께 사용할 수 있습니다. 예를 들어, 모든 관련 리소스에 대해 일반 논리적 ID 접두사를 사용할 경우 와일드카드를 사용하여 모두 지정할 수 있습니다.

"Resource" : ["LogicalResourceId/CriticalResource*"]

Not 요소를 리소스와 함께 사용할 수도 있습니다. 예를 들어, 하나를 제외한 모든 리소스에 대한 업데이트를 허용하려면 NotResource 요소를 사용하여 해당 리소스를 보호합니다.

{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/ProductionDatabase" } ] }

스택 정책을 설정하는 경우 명시적으로 허용되지 않는 업데이트는 거부됩니다. ProductionDatabase 리소스를 제외한 모든 리소스에 대한 업데이트를 허용하여 ProductionDatabase 리소스에 대한 업데이트를 거부합니다.

조건

정책이 적용되는 리소스 유형을 지정합니다. 특정 리소스의 논리적 ID를 지정하려면 Resource 요소를 사용합니다.

다음 예제와 같이 리소스 유형(예: 모든 EC2 및 RDS DB 인스턴스)을 지정할 수 있습니다.

{ "Statement" : [ { "Effect" : "Deny", "Principal" : "*", "Action" : "Update:*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::EC2::Instance", "AWS::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Principal" : "*", "Action" : "Update:*", "Resource" : "*" } ] }

Allow 문은 모든 리소스에 대한 업데이트 권한을 부여하고 Deny 문은 EC2 및 RDS DB 인스턴스에 대한 업데이트를 거부합니다. Deny 문은 항상 허용 작업보다 우선합니다.

와일드카드를 리소스 유형과 함께 사용할 수 있습니다. 예를 들어, 다음 예제와 같이 와일드카드를 사용하여 모든 Amazon EC2 리소스(예: 인스턴스, 보안 그룹, 서브넷 등)에 대한 업데이트 권한을 거부할 수 있습니다.

"Condition" : { "StringLike" : { "ResourceType" : ["AWS::EC2::*"] } }

와일드카드를 사용할 경우 StringLike 조건을 사용해야 합니다.

스택 정책 설정

스택을 생성할 때 콘솔 또는 AWS CLI를 사용하여 스택 정책을 적용할 수 있습니다. AWS CLI를 사용하여 기존 스택에 스택 정책을 적용할 수도 있습니다. 스택 정책을 적용한 이후에는 스택에서 스택 정책을 제거할 수 없지만, AWS CLI를 사용하여 스택 정책을 수정할 수 있습니다.

스택 정책은 스택을 업데이트하려 하는 모든 AWS CloudFormation 사용자에게 적용됩니다. 다른 스택 정책을 다른 사용자와 연결할 수 없습니다.

스택 정책 작성에 대한 자세한 내용은 스택 정책 정의 단원을 참조하십시오.

스택을 생성할 때 스택 정책을 설정하려면(콘솔)
  1. AWS CloudFormation 콘솔(https://console.aws.amazon.com/cloudformation)을 엽니다.

  2. CloudFormation Stacks(CloudFormation 스택) 페이지에서 스택 생성을 선택합니다.

  3. 스택 생성 마법사의 Configure stack options(스택 옵션 구성) 페이지에서 고급 섹션을 확장하고 스택 정책을 선택하십시오.

  4. 스택 정책을 지정합니다.

    • 콘솔에서 정책을 직접 작성하려면 Enter stack policy(스택 정책 입력)을 선택한 다음 텍스트 필드에 직접 스택 정책을 입력하십시오.

    • 별도의 파일에 정의된 정책을 사용하려면 파일 업로드를 선택한 다음 파일 선택을 선택하여 스택 정책이 포함된 파일을 선택하십시오.

스택을 생성할 때 스택 정책을 설정하려면(AWS CLI)
  • aws cloudformation create-stack 명령에서 --stack-policy-body 옵션을 사용하여 수정된 정책을 입력하거나 --stack-policy-url 옵션을 사용하여 정책이 포함된 파일을 지정합니다.

기존 스택에 대한 스택 정책을 설정하려면(AWS CLI 전용)
  • aws cloudformation set-stack-policy 명령에서 --stack-policy-body 옵션을 사용하여 수정된 정책을 입력하거나 --stack-policy-url 옵션을 사용하여 정책이 포함된 파일을 지정합니다.

    참고

    기존 스택에 정책을 추가하려면 AWS CloudFormation SetStackPolicy 작업에 대한 권한이 있어야 합니다.

보호된 리소스 업데이트

보호된 리소스를 업데이트하려면 스택 정책을 재정의하고 해당 리소스에 대한 업데이트를 허용하는 임시 정책을 생성합니다. 스택을 업데이트할 때 재정의 정책을 지정합니다. 재정의 정책은 스택 정책을 영구히 변경하지 않습니다.

보호된 리소스를 업데이트하려면 AWS CloudFormation SetStackPolicy 작업을 사용할 권한이 있어야 합니다. AWS CloudFormation 권한 설정에 대한 자세한 내용은 AWS Identity and Access Management을 통한 액세스 제어 단원을 참조하십시오.

참고

스택 업데이트 중에 AWS CloudFormation에서는 다른 업데이트된 리소스에 종속되는 리소스를 자동으로 업데이트합니다. 예를 들어, AWS CloudFormation은 업데이트된 리소스를 참조하는 리소스를 업데이트합니다. AWS CloudFormation에서는 자동으로 업데이트된 리소스를 물리적으로 변경하지 않지만(예: 리소스의 ID), 스택 정책이 해당 리소스와 연결되어 있는 경우 해당 리소스를 업데이트할 권한이 있어야 합니다.

보호된 리소스를 업데이트하려면(콘솔)
  1. AWS CloudFormation 콘솔(https://console.aws.amazon.com/cloudformation)을 엽니다.

  2. 업데이트할 스택을 선택하고 Stack actions(스택 작업), 스택 업데이트를 차례로 선택합니다.

  3. 스택 템플릿을 수정하지 않은 경우, 현재 템플릿 사용을 선택하고 다음을 클릭합니다. 템플릿을 수정한 경우 Replace current template(현재 템플릿 교체)을 선택하고 Specify template(템플릿 지정) 섹션에서 업데이트된 템플릿의 위치를 지정하십시오.

    • 컴퓨터에 로컬로 저장된 템플릿의 경우 템플릿 파일 업로드를 선택합니다. 파일 선택을 선택하여 파일을 찾아서 선택한 다음 다음을 클릭합니다.

    • Amazon S3 버킷에 저장된 템플릿의 경우 Amazon S3URL을 선택하십시오. 템플릿에 대한 URL을 입력하거나 붙여넣고 다음을 클릭합니다.

      템플릿이 버전 관리를 사용하는 버킷에 있는 경우 특정 버전의 템플릿(예: https://s3.amazonaws.com/templates/myTemplate.template?versionId=123ab1cdeKdOW5IH4GAcYbEngcpTJTDW)을 지정할 수 있습니다. 자세한 내용을 알아보려면 Amazon Simple Storage Service 사용 설명서Managing objects in a versioning-enabled bucket(버전 관리를 사용하는 버킷의 객체 관리)을 참조하세요.

  4. 템플릿에 파라미터가 포함되어 있는 경우 스택 세부 정보 지정 페이지에서 파라미터 값을 입력하거나 수정하고 다음을 선택합니다.

    AWS CloudFormation에서 NoEcho 속성으로 선언된 파라미터를 제외하고 스택에 현재 설정된 값으로 각 파라미터를 채웁니다. 기존 값 사용을 선택하여 파라미터에 대한 현재 값을 사용할 수 있습니다.

    동적 파라미터를 사용하여 보안 암호를 관리하는 방법 및 NoEcho를 사용하여 민감한 정보를 마스킹 처리하는 방법에 대한 자세한 내용은 템플릿에 자격 증명을 포함하지 않음 모범 사례를 참조하세요.

  5. 스택 정책 재정의를 지정합니다.

    1. Configure stack options(스택 옵션 구성) 페이지의 고급 옵션 섹션에서 스택 정책을 선택하십시오.

    2. 파일 업로드를 선택하십시오.

    3. 파일 선택을 클릭하고 스택 정책 재정의가 포함된 파일을 찾거나 정책을 입력하십시오.

    4. 다음을 선택합니다.

    재정의 정책에서는 업데이트하려는 보호된 리소스에 대해 Allow 문을 지정해야 합니다. 예를 들어, 모든 보호된 리소스를 업데이트하려면 모든 업데이트를 허용하는 임시 재정의 정책을 지정합니다.

    { "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }
    참고

    AWS CloudFormation에서는 이 업데이트 중에만 재정의 정책을 적용합니다. 재정의 정책은 스택 정책을 영구히 변경하지 않습니다. 스택 정책을 수정하려면 스택 정책 수정 단원을 참조하십시오.

  6. 스택 정보와 제출한 변경 사항을 검토합니다.

    올바른 정보(예: 올바른 파라미터 값 또는 템플릿 URL)를 제출했는지 확인합니다. 템플릿에 IAM 리소스가 포함되어 있는 경우 이 템플릿이 IAM 리소스를 생성할 수 있음을 확인합니다(I acknowledge that this template may create IAM resources)를 선택하여 템플릿에서 IAM 리소스를 사용하도록 지정합니다. 템플릿에서 IAM 리소스를 사용하는 방법에 대한 자세한 내용은 AWS Identity and Access Management을 통한 액세스 제어 단원을 참조하십시오.

    변경 미리 보기 섹션에서 AWS CloudFormation에서 필요한 모든 변경을 수행하는지 확인합니다. 예를 들어, 추가, 제거 또는 수정하려는 리소스를 AWS CloudFormation에서 추가, 제거 또는 수정하는지 확인합니다. AWS CloudFormation에서는 스택에 대한 변경 세트를 만들어 이 미리 보기를 생성합니다. 자세한 내용은 변경 세트를 사용하여 스택 업데이트 단원을 참조하십시오.

  7. 변경 사항이 만족스러우면 업데이트를 클릭합니다.

    참고

    이때, 제안한 업데이트를 보다 철저하게 검토하기 위해 변경 세트를 볼 수도 있습니다. 이렇게 하려면 Update(업데이트) 대신 View change set(변경 세트 보기)를 클릭합니다. CloudFormation은 업데이트를 기반으로 생성된 변경 세트를 표시합니다. 스택 업데이트를 수행할 준비가 되면 실행을 클릭하십시오.

    CloudFormation은 해당 스택의 스택 세부 정보 페이지를 표시합니다. 이제 스택의 상태는 UPDATE_IN_PROGRESS입니다. CloudFormation이 스택 업데이트를 성공적으로 완료하면 스택 상태가 UPDATE_COMPLETE로 설정됩니다.

    스택 업데이트가 실패하면 CloudFormation에서 변경 사항을 자동으로 롤백하고 스택 상태를 UPDATE_ROLLBACK_COMPLETE로 설정합니다.

보호된 리소스 업데이트(AWS CLI)
  • aws cloudformation update-stack 명령에서 --stack-policy-during-update-body 옵션을 사용하여 수정된 정책을 입력하거나 --stack-policy-during-update-url 옵션을 사용하여 정책이 포함된 파일을 지정합니다.

    참고

    AWS CloudFormation에서는 이 업데이트 중에만 재정의 정책을 적용합니다. 재정의 정책은 스택 정책을 영구히 변경하지 않습니다. 스택 정책을 수정하려면 스택 정책 수정 단원을 참조하십시오.

스택 정책 수정

추가 리소스를 보호하거나 리소스에서 보호를 제거하려면 스택 정책을 수정합니다. 예를 들어, 보호할 데이터베이스를 스택에 추가할 경우 데이터베이스에 대한 Deny 문을 스택 정책에 추가합니다. 정책을 수정하려면 SetStackPolicy 작업을 사용할 권한이 있어야 합니다.

AWS CLI를 사용하여 스택 정책을 수정합니다.

스택 정책 수정(AWS CLI)
  • aws cloudformation set-stack-policy 명령에서 --stack-policy-body 옵션을 사용하여 수정된 정책을 입력하거나 --stack-policy-url 옵션을 사용하여 정책이 포함된 파일을 지정합니다.

스택 정책을 삭제할 수 없습니다. 모든 리소스에서 모든 보호를 제거하려면 모든 리소스에 대해 모든 작업을 명시적으로 허용하도록 정책을 수정합니다. 다음 정책은 모든 리소스에 대한 모든 업데이트를 허용합니다.

{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

더 많은 예제 스택 정책

다음 정책 예제에서는 모든 스택 리소스 및 특정 리소스에 대한 업데이트와 특정 유형의 업데이트를 방지하는 방법을 보여줍니다.

모든 스택 리소스에 대한 업데이트 방지

모든 스택 리소스에 대한 업데이트를 방지하기 위해 다음 정책에서는 모든 리소스에 관한 모든 업데이트 작업에 대해 Deny 문을 지정합니다.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

단일 리소스에 대한 업데이트 방지

다음 정책은 논리적 ID가 MyDatabase인 데이터베이스에 대한 모든 업데이트 작업을 거부하고, Allow 문을 사용하여 나머지 모든 스택 리소스에 대한 모든 업데이트 작업을 허용합니다. Allow 문이 허용 작업보다 항상 우선하므로 MyDatabase 문은 Deny 리소스에 적용되지 않습니다.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "LogicalResourceId/MyDatabase" }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

기본 거부를 사용하여 이전 예제와 동일한 결과를 얻을 수 있습니다. 스택 정책을 설정하는 경우 AWS CloudFormation에서는 명시적으로 허용되지 않은 모든 업데이트를 거부합니다. 다음 정책은 기본적으로 거부되는 ProductionDatabase 리소스를 제외한 모든 리소스에 대한 업데이트를 허용합니다.

{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/ProductionDatabase" } ] }
중요

기본 거부를 사용할 경우 위험이 있습니다. 정책 내의 다른 위치에 Allow 문이 있는 경우(예: 와일드카드를 사용하는 Allow 문) 원치 않는 리소스에 대한 업데이트 권한을 자신도 모르게 허용할 수 있습니다. 명시적 거부가 허용 작업보다 우선하므로 Deny 문을 사용하여 리소스를 보호할 수 있습니다.

특정 리소스 유형의 모든 인스턴스에 대한 업데이트 방지

다음 정책은 RDS DB 인스턴스 리소스 유형에 대한 모든 업데이트 작업을 거부하고, Allow 문을 사용하여 나머지 모든 스택 리소스에 대한 모든 업데이트 작업을 허용합니다. Allow 문이 허용 작업보다 항상 우선하므로 Deny 문은 RDS DB 인스턴스 리소스에 적용되지 않습니다.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

인스턴스에 대한 대체 업데이트 방지

다음 정책은 논리적 ID가 MyInstance인 인스턴스를 바꿔야 하는 업데이트를 거부하고, Allow 문을 사용하여 나머지 모든 스택 리소스에 대한 모든 업데이트 작업을 허용합니다. Allow 문이 허용 작업보다 항상 우선하므로 MyInstance 문은 Deny 리소스에 적용되지 않습니다.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:Replace", "Principal": "*", "Resource" : "LogicalResourceId/MyInstance" }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

중첩 스택에 대한 업데이트 방지

다음 정책은 AWS CloudFormation 스택 리소스 유형(중첩 스택)에 대한 모든 업데이트 작업을 거부합니다. Allow 문을 사용하여 나머지 모든 스택 리소스에 대한 모든 업데이트 작업을 허용합니다. Allow 문이 허용 작업보다 항상 우선하므로 Deny 문은 AWS CloudFormation 스택 리소스에 적용되지 않습니다.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::CloudFormation::Stack"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }