Openflow 설정하기

이 항목에서는 Openflow를 설정하는 단계에 대해 설명합니다.

Openflow를 설정하는 단계는 다음과 같습니다.

전제 조건

Snowflake 및 AWS 계정에서 완료해야 하는 전제 조건은 다음과 같습니다.

Snowflake 계정

  • Snowflake 계정에서 이미지 리포지토리를 사용한 적이 없는 경우 배포 서비스가 Snowflake에서 Openflow 이미지를 가져올 수 있도록 다음을 설정해야 합니다.

    USE ROLE ACCOUNTADMIN;
    
    CREATE DATABASE IF NOT EXISTS OPENFLOW;
    USE OPENFLOW;
    CREATE SCHEMA IF NOT EXISTS OPENFLOW;
    USE SCHEMA OPENFLOW;
    CREATE IMAGE REPOSITORY IF NOT EXISTS OPENFLOW;
    grant usage on database OPENFLOW to role public;
    grant usage on schema OPENFLOW to role public;
    grant read on image repository OPENFLOW.OPENFLOW.OPENFLOW to role public;
    
    Copy
  • Openflow를 설정하려면 Snowflake 계정 수준에서 새 권한을 정의해야 합니다. 새 권한은 기본 권한 세트의 일부로 ACCOUNTADMIN 역할에 할당됩니다. ACCOUNTADMIN 은 자동으로 다음 두 가지 권한을 가지며, 다음 코드에서 $OPENFLOW_ADMIN_ROLE 로 표시된 Openflow 관리자 역할에 대해 선택한 역할에 권한을 부여할 수 있습니다.

    USE ROLE ACCOUNTADMIN;
    
    GRANT CREATE OPENFLOW DATA PLANE INTEGRATION ON ACCOUNT TO ROLE $OPENFLOW_ADMIN_ROLE;
    GRANT CREATE OPENFLOW RUNTIME INTEGRATION ON ACCOUNT TO ROLE $OPENFLOW_ADMIN_ROLE;
    
    Copy
  • 또한 모든 Openflow 사용자에 대해 default_secondary_rolesALL 로 설정해야 합니다. Openflow 작업은 기본 역할뿐만 아니라 인증된 사용자의 역할 중 하나를 사용하여 승인되기 때문입니다. 각 Openflow 사용자에 대해 다음 코드에서 $OPENFLOW_USER 를 바꿉니다.

    USE ROLE ACCOUNTADMIN;
    
    ALTER USER $OPENFLOW_USER SET DEFAULT_SECONDARY_ROLES = ('ALL');
    
    Copy

배포 통합 권한

배포 통합 오브젝트는 1개 이상의 Snowflake Openflow 런타임을 배포하기 위해 프로비저닝된 리소스 세트를 나타냅니다. 자체 클라우드 리소스를 가져오는 조직의 경우, 배포 통합 오브젝트는 관리되는 Kubernetes 클러스터와 관련 노드를 나타냅니다.

CREATE DATA PLANE INTEGRATION 권한이 있는 사용자는 배포 통합 오브젝트를 생성하고 삭제할 수 있습니다.

배포 통합 오브젝트에 직접 추가 권한을 정의하여 액세스 권한의 차별화를 지원할 수 있습니다.

배포 통합 오브젝트에 다음 권한을 부여할 수 있습니다.

  • OWNERSHIP: 배포 삭제를 포함하여 배포 작업 오브젝트를 완벽하게 제어할 수 있습니다.

  • USAGE: 런타임 하위 오브젝트를 생성할 수 있습니다.

런타임 권한

런타임 오브젝트는 플로우 정의를 실행하도록 프로비저닝된 1개 이상의 Snowflake Openflow 런타임 서버의 클러스터를 나타냅니다. Kubernetes 배포의 경우, 런타임 오브젝트는 네임스페이스에 배포된 Snowflake Openflow 런타임 컨테이너와 지원 구성 요소의 상태 저장 세트를 나타낸다.

상위 배포 통합 오브젝트에 대한 OWNERSHIP 권한과 CREATE RUNTIME INTEGRATION 계정 수준 권한이 있는 사용자는 런타임 통합 오브젝트를 생성할 수 있습니다. 런타임 통합 오브젝트에 직접 추가 권한을 정의하여 액세스 권한의 차별화를 지원할 수 있습니다.

런타임 통합 오브젝트에 다음 권한을 부여할 수 있습니다.

  • OWNERSHIP: 관련 런타임 삭제 및 런타임 플로우 정의 수정을 포함하여 런타임 작업을 완벽하게 제어할 수 있습니다.

  • USAGE: 배포된 런타임에 대한 읽기 액세스를 활성화하여 상태 및 상태를 변경하지 않고 관찰할 수 있습니다.

역할 설정 예시

다음과 같은 역할을 설정하려는 다음 시나리오를 고려해 보겠습니다.

  • accountadmin: 이 두 가지 CREATE 권한이 있는 Snowflake의 기본 제공 역할입니다.

    • CREATE OPENFLOW DATA PLANE INTEGRATION

    • CREATE OPENFLOW RUNTIME INTEGRATION

  • deployment_manager: 배포를 생성, 관리 및 삭제할 수 있는 역할입니다

  • deployment1_runtime_manager_1: 배포 1 내에서만 런타임을 생성할 수 있는 역할로, 배포 1 내에서 생성한 런타임은 수정 및 삭제할 수 있지만 배포 1_runtime_manager_2에서 생성한 런타임은 수정 및 삭제할 수 없습니다.

  • deployment1_runtime_manager_2: 배포 1 내에서만 런타임을 생성할 수 있는 역할로, 배포 1 내에서 생성한 런타임을 수정 및 삭제할 수 있지만 배포 1_runtime_manager_1에서 생성한 런타임은 수정 및 삭제할 수 없습니다.

  • deployment1_runtime_viewer_1: 배포 1에서 생성된 배포 1 내에서 런타임 캔버스를 볼 수 있는 역할입니다(deployment1_runtime_manager_1).

  • deployment1_runtime_viewer_2: 배포 1에서 생성된 배포 2 내에서 런타임 캔버스를 볼 수 있는 역할입니다.

  • deployment2_runtime_manager: 배포 2 내에서만 런타임을 생성할 수 있는 역할입니다.

  • deployment2_runtime_viewer: 배포 2 내에서 런타임 캔버스를 볼 수 있는 역할입니다.

이러한 역할로 Openflow를 설정하려면 다음과 같이 하십시오.

  1. 새 역할을 생성하고 관련 권한을 할당합니다.

    use role accountadmin;
    create role if not exists deployment_manager;
    create role if not exists deployment1_runtime_manager_1;
    create role if not exists deployment1_runtime_manager_2;
    create role if not exists deployment1_runtime_viewer_1;
    create role if not exists deployment1_runtime_viewer_2;
    create role if not exists deployment2_runtime_manager;
    create role if not exists deployment2_runtime_viewer;
    
    
    -- assign create deployment privilege to roles, since this privilege cannot be granted in openflow ui
    grant create openflow data plane integration on account to role deployment_manager;
    
    
    -- assign create runtime privilege to roles, since this privilege cannot be granted in cp ui
    grant create openflow runtime integration on account to role deployment1_runtime_manager_1;
    grant create openflow runtime integration on account to role deployment1_runtime_manager_2;
    grant create openflow runtime integration on account to role deployment2_runtime_manager;
    
    
    -- grant these roles to desired users
    grant role <role name> to user <username>;
    
    ........
    
    Copy
  2. 배포를 생성합니다.

    1. Deployment_manager로 로그인합니다.

    2. Openflow UI 에서 deployment 1을 생성합니다. deployment1_runtime_manager_1 및 deployment1_runtime_manager_2에 USAGE 권한을 부여합니다.

    3. Openflow UI 에서 deployment 2를 생성합니다. deployment2_runtime_manager에 USAGE 권한을 부여합니다.

      해당 배포에서 런타임을 생성하려면 배포에 대한 CREATE OPENFLOW RUNTIME INTEGRATION 권한과 USAGE 권한이 필요합니다.

  3. 배포 1에 deployment1_runtime_manager_1로 런타임을 생성합니다.

    1. Deployment1_runtime_manager_1로 로그인합니다.

    2. 다음 섹션에 설명된 대로 런타임을 생성합니다. deployment1_runtime_manager_1은 런타임을 생성하고 이 배포 내에서 생성한 모든 런타임을 관리할 수 있어야 합니다.

    3. Openflow UI 에서 deployment1_runtime_viewer_1을 선택하고 USAGE 권한을 부여합니다.

AWS 계정

AWS 계정에서 다음 사항을 확인하십시오.

  • CloudFormation 스택을 생성하는 데 필요한 권한이 있는 AWS 계정이 있습니다.

  • 조직에 CloudFormation 스크립트를 실행하여 새 VPC (CloudFormation 에서 생성) 또는 기존 VPC 안에 EKS 를 설정할 수 있는 기능을 가진 AWS 관리자가 있습니다. BYO - VPC (기존 VPC) 에 대한 전제 조건 을 참조하십시오.

참고

AWS 계정에서 Openflow 설치가 이루어지는 방법과 CloudFormation 템플릿으로 구성된 권한에 대해 알아보려면 설치 프로세스 를 참조하십시오.

BYO - VPC (기존 VPC)의 전제 조건

기존 VPC 및 개인 서브넷을 사용하려는 경우 다음 사항이 있는지 확인하십시오.

  • 1개 VPC

  • VPC 에 연결된 1개의 인터넷 게이트웨이

  • 서로 다른 가용 존에 있는 두 개의 공용 서브넷:

    • 공개 서브넷은 최소 /27 CIDR 범위이며, 공개 서브넷에는 32 IPs 가 할당되어야 합니다.

    • 두 공용 서브넷 모두 대상 0.0.0.0/0 및 대상 인터넷 게이트웨이에 대한 라우팅이 있어야 합니다.

    • AWS 네트워크 로드 밸런서는 고가용성을 요구하기 때문에 공용 서브넷은 서로 다른 가용 존은 위치해야 합니다.

    • AWS 로드 밸런서를 생성하려면 공용 서브넷에 다음과 같이 태그를 지정해야 합니다.

      • 키: kubernetes.io/role/elb

      • 값: 1

  • 공용 서브넷에 연결된 연결 유형이 “공용”인 NAT 게이트웨이 1개.

  • 가용성 존이 다른 2개의 프라이빗 서브넷.

    • 서브넷은 최소 /24 CIDR 범위여야 하며, 할당 가능한 IPs 가 256개 이상이어야 합니다. 이렇게 하면 생성할 수 있는 런타임의 수와 규모가 제한되므로 배포에 더 큰 범위를 사용하는 것이 더 적합할 수 있습니다.

    • 각 비공개 서브넷에는 공개 서브넷의 NAT 게이트웨이에 대한 0.0.0.0/0 라우팅 테이블 항목이 필요합니다.

    • 이러한 서브넷은 EKS 프로비저닝의 전제 조건인 서로 다른 가용 영역에 있어야 합니다.

다음은 몇 가지 유의해야 할 사항입니다.

  • Openflow 배포 에이전트는 인터넷 게이트웨이에 바인딩되어야 하는 비공개 서브넷 1에서 실행됩니다. 그렇지 않으면 초기화 또는 설정이 올바르게 되지 않으며 인프라가 프로비저닝되지 않습니다.

  • 비공개 서브넷에서 라우팅할 수 있는 공개 NAT 게이트웨이가 없으면 EKS 클러스터와 같은 리소스는 인터넷에 액세스할 수 없습니다. 또한 배포 에이전트는 Openflow 배포를 설치할 수 없습니다.

Openflow 서비스 약관에 동의합니다

이 단계는 조직에 대해 한 번만 필수입니다.

  1. ORGADMIN 역할이 있는 사용자로 Snowflake에 로그인합니다.

  2. Data » Openflow 으로 이동합니다.

  3. Openflow 서비스 약관에 동의합니다.

클라우드에서 배포 생성하기

중요

사용자의 기본 역할이 ACCOUNTADMIN, ORGADMIN, GLOBALORGADMIN, SECURITYADMIN 인 경우 Openflow에 로그인할 수 없습니다. 사용자의 기본 역할을 ACCOUNTADMIN, ORGADMIN 또는SECURITYADMIN 이외의 역할로 변경해야 Openflow에 로그인할 수 있습니다. 자세한 내용은 사전 요구 사항 을 참조하십시오.

  1. ACCOUNTADMIN 에서 Openflow 사용을 위해 할당된 역할로 Snowflake에 로그인합니다.

  2. Data » Openflow 으로 이동합니다.

  3. Launch Openflow 을 선택합니다.

  4. Openflow UI 에서 Create a deployment 를 선택합니다. Deployments 탭이 열립니다.

  5. Create a deployment 를 선택합니다. 배포 생성하기 마법사가 열립니다.

  6. Prerequisites 단계에서 모든 요구 사항을 충족하는지 확인합니다. Next 를 선택합니다.

  7. Deployment location 단계에서 Amazon Web Services 를 배포 위치로 선택합니다. 배포 이름을 입력합니다. Next 를 선택합니다.

  8. Configuration 단계에서 다음 구성 옵션 중 하나를 선택할 수 있습니다.

    • Fully managed VPC: VPC 에서 관리하도록 하려면 이 옵션을 선택합니다

    • Bring your own VPC: 기존 VPC 를 사용하려는 경우 이 옵션을 선택합니다.

  9. Create Deployment 를 선택합니다.

  10. 배포가 구성되면 CloudFormation 템플릿을 다운로드하여 AWS 계정에서 설정 프로세스를 완료할 수 있는 대화 상자가 표시됩니다. 이 템플릿을 다운로드하고 AWS 계정으로 이동합니다.

  11. AWS 계정에서 템플릿을 사용하여 CloudFormation 스택을 새로 생성합니다. Openflow 배포 에이전트의 EC2 인스턴스가 생성된 후에는 인프라를 코드 스크립트로 사용하여 나머지 설치 프로세스 를 완료합니다. 설치 진행 상황 추적하기 에 설명된 대로 설치 진행 상황을 추적할 수 있습니다.

    기존 VPC 를 사용하는 경우 CloudFormation 템플릿을 업로드한 후 2개의 비공개 서브넷과 VPC 에 대한 드롭다운 목록에서 각각의 값을 선택합니다.

  12. Snowflake 계정으로 이동합니다.

  13. [선택 사항] 이 단계는 네트워크 정책을 사용하여 Snowflake에 대한 액세스를 제어하는 경우에만 필요합니다. Openflow에 대한 네트워크 규칙을 생성하고 이를 Snowflake 계정에 대한 기존 네트워크 정책에 추가합니다. 네트워크 정책은 어떤 IP 주소가 Snowflake 계정에 액세스할 수 있는지 제어하는 일련의 규칙입니다. 다음 코드 스니펫에서 {$NAT_GATEWAY_PUBLIC_IP} 를CloudFormation 스택의 일부로 생성된 NAT 게이트웨이 공개 IP 주소로 바꿉니다(AWS 콘솔에서 NAT 게이트웨이를 검색하거나 CFN 스택의 출력을 확인). NAT 게이트웨이는 DPA 및 EKS 모두에 대한 Openflow 송신을 담당합니다. DPA 및 EKS 모두 설치의 비공개 서브넷 1에서 실행됩니다.

    USE ROLE ACCOUNTADMIN;
    USE DATABASE {REPLACE_WITH_YOUR_DB_NAME};
    
    CREATE NETWORK RULE allow_openflow_deployment
    MODE = INGRESS
    TYPE = IPV4
    VALUE_LIST = ('{$NAT_GATEWAY_PUBLIC_IP}/32');
    
    -- Run this command to find your currently active network policy and copy the value column
    SHOW PARAMETERS LIKE 'NETWORK_POLICY' IN ACCOUNT;
    -- Now add the new network rule to this policy
    ALTER NETWORK POLICY {ENTER_YOUR_ACTIVE_NETWORK_POLICY_NAME} ADD ALLOWED_NETWORK_RULE_LIST = (allow_openflow_deployment);
    
    Copy
  1. 이벤트 테이블을 만듭니다. 이벤트 테이블은 사용자 작업, 시스템 로그, 트랜잭션 등의 이벤트 데이터를 저장하고 관리하기 위해 설계되었습니다. Openflow별 이벤트 테이블 또는 계정별 이벤트 테이블을 사용하도록 선택할 수 있습니다.

    • Openflow 전용 이벤트 테이블 생성하기

      USE ROLE accountadmin;
      GRANT create event table on schema OPENFLOW.OPENFLOW to role $ROLE_OF_DEPLOYMENT_OWNER;
      
      USE ROLE $ROLE_OF_DEPLOYMENT_OWNER;
      CREATE event table if not exists openflow.openflow.openflow_events;
      
      -- Find the Data Plane Integrations
      SHOW openflow data plane integrations;
      
      ALTER openflow data plane integration
      $OPENFLOW_deployment_UUID
      SET event_table = 'openflow.openflow.openflow_events';
      
      Copy
    • 계정별 이벤트 테이블 생성하기

      USE database openflow;
      CREATE schema if not exists openflow.telemetry;
      CREATE event table if not exists openflow.telemetry.events;
      ALTER ACCOUNT SET EVENT_TABLE = openflow.telemetry.events;
      
      Copy
  2. Openflow UI 로 이동합니다. AWS 에서 배포를 생성하는 데는 약 45분이 소요됩니다. 배포가 생성되면 Openflow UI 의 배포 탭에서 Active 로 표시된 상태로 배포를 볼 수 있습니다 .

클라우드에서 런타임 환경 생성하기

  1. Openflow Control Plane 에서 Create a runtime 를 선택합니다. Create Runtime 대화 상자가 나타납니다.

  2. Deployment 드롭다운 목록에서 런타임을 생성할 배포를 선택합니다.

  3. 런타임의 이름을 입력합니다.

  4. Node type 드롭다운 목록에서 노드 유형을 선택합니다. 노드의 크기를 지정합니다.

  5. Min/Max node 범위 선택기에서 범위를 선택합니다. 최소값은 런타임이 시작될 때 생성되는 노드 수를 지정하고 최대값은 데이터 양이 많거나 CPU 로딩 중일 때 런타임이 확장할 수 있는 노드 수를 지정합니다.

  6. Create 를 선택합니다. 런타임이 생성되는 데 몇 분 정도 걸립니다.

런타임이 생성되면 Openflow 컨트롤 플레인의 Runtimes 탭으로 이동하여 런타임을 볼 수 있습니다. 런타임을 클릭하여 Openflow 캔버스를 엽니다.

다음 단계

런타임에 커넥터를 배포합니다. Openflow에서 사용 가능한 커넥터 목록은 Openflow 커넥터 섹션을 참조하십시오.

네트워크 고려 사항: Openflow EKS 에서 소스 시스템으로의 연결

Openflow CloudFormation 스택은 다음을 생성합니다.

  • 2개의 공개 서브넷과 2개의 비공개 서브넷이 있는 VPC 1개

  • 공개 서브넷은 나중에 생성되는 AWS 네트워크 로드 밸런서를 호스트하고, 비공개 서브넷은 EKS 클러스터와 노드 그룹을 백업하는 모든 EC2 인스턴스를 호스팅합니다. Openflow 런타임은 비공개 서브넷 1 내에서 실행됩니다.

  • NAT 게이트웨이는 현재 DPA 및 EKS 모두에 대한 송신입니다. DPA 및 EKS 모두 설치의 비공개 서브넷 1에서 실행됩니다.

예: 동일한 계정의 다른 VPC 에서 RDS 와 통신하기 위해 새로운 VPC 로 BYOC 배포

Openflow EKS 클러스터와 RDS 인스턴스 간의 통신을 활성화하려면 EKS 클러스터 보안 그룹을 RDS 연결에 대한 인바운드 규칙의 소스로 사용하여 새 보안 그룹을 생성하고 RDS 에 그룹을 첨부해야 합니다.

  1. EKS 클러스터 보안 그룹을 찾아 EKS 로 이동하여 배포 키를 찾습니다. 다음 단계를 수행하여 Openflow UI 에서도 찾을 수 있습니다.

    1. Openflow에 로그인합니다.

    2. Deployments 탭으로 이동합니다.

    3. 배포 옆에 있는 추가 옵션 아이콘을 선택합니다.

    4. View details 를 선택합니다. Key 필드의 값은 배포 키입니다.

  2. 배포 키를 찾은 후 이를 사용하여 키 값으로 AWS 리소스를 필터링할 수 있습니다.

  3. 관련 데이터베이스 포트(기본값은 PostgreSQL 의 경우 5432)를 통해 Openflow EKS 클러스터에 액세스할 수 있는 새 보안 그룹을 생성합니다.

  4. RDS 에 새 보안 그룹으로 첨부합니다.

문제를 해결해야 하는 경우 Reachability Analyzer 가 유용할 수 있습니다. AWS 플랫폼 내에서 추적 기능을 사용하여 연결을 차단하는 원인에 대한 자세한 정보를 제공합니다.

VPC 피어링 및 관련 보안 그룹 구성을 사용하여 DB 인스턴스에 액세스하려면 다음 AWS 문서를 참조하십시오.

설치 절차

CloudFormation 스택과 Openflow Agent 사이에는 BYOC 배포 설치 프로세스가 관리하는 몇 가지 조정된 단계가 있습니다. 목표는 조직이 BYOC 배포(CloudFormation 을 통해 확인됨)에 입력을 쉽게 제공할 수 있는 콜드 스타트와 시간이 지나면서 변경해야 하는 배포 및 주요 소프트웨어 구성(Openflow Agent를 통해 확인됨)의 책임을 분리하는 것입니다.

배포 Agent는 Openflow 배포 인프라를 생성하고 배포 서비스를 포함한 배포 소프트웨어 구성 요소를 쉽게 설치할 수 있도록 지원합니다. 배포 에이전트는 Snowflake 시스템 이미지 레지스트리로 인증하여 Openflow 컨테이너 이미지를 가져옵니다.

단계는 다음과 같습니다.

참고

BYO - VPC 를 사용하는 경우 템플릿에서 VPC ID 와 2개의 비공개 서브넷 IDs 를 선택하면 CloudFormation 스택은 1a, 1b, 1c 단계에서 언급한 리소스를 생성하지 않고 선택한 것을 사용합니다.

  1. CloudFormation 템플릿은 다음을 생성하고 구성된 AWS 권한에 언급된 AWS 권한 으로 구성합니다.

    1. 공개 서브넷 2개와 비공개 서브넷 2개가 있는 VPC 1개. 공개 서브넷은 AWS 네트워크 로드 밸런서(나중에 생성됨)를 호스팅합니다. 비공개 서브넷은 EKS 클러스터와 NodeGroups 을 지원하는 모든 EC2 인스턴스를 호스팅합니다. Openflow 런타임은 비공개 서브넷 내에서 실행됩니다.

    2. VPC 로부터의 송신을 위한 인터넷 게이트웨이

    3. 비공개 서브넷으로부터의 송신을 위한 NAT 게이트웨이

    4. 사용자가 입력한 OIDC 구성에 대한 AWS 시크릿 관리자 항목

    5. IAM Openflow Agent가 EC2 인스턴스에서 사용할 역할 및 인스턴스 프로필을 설정합니다

    6. 초기화 프로세스를 자동으로 실행하는 UserData 스크립트가 포함된 Openflow 배포 에이전트용 EC2 인스턴스입니다. 이 스크립트는 입력된 CloudFormation 매개 변수에서 파생된 Openflow 배포 에이전트가 사용할 환경 변수를 설정합니다.

    7. 필요할 때 배포를 업그레이드하기 위해 Openflow 배포 에이전트를 위한 EC2 Instance Connect 엔드포인트입니다.

      • BYO - VPC 를 사용하는 경우 기본적으로 CloudFormation 스택은 EC2 Instance Connect 엔드포인트를 생성합니다. 하지만 이 기본 동작은 수정할 수 있습니다. 관리되는 VPC 옵션을 사용하는 경우 CloudFormation 스택은 항상 EC2Instance Connect 엔드포인트를 생성합니다.

      • Instance Connect 엔드포인트는 여러 VPCs 에서 공유할 수 있습니다.

      • 배포가 삭제되면 CloudFormation 스택을 삭제하는 것과 함께 엔드포인트도 제거됩니다. 이렇게 하면 엔드포인트가 공유되는 경우 다른 BYO-VPC 에이전트에 대한 액세스가 차단됩니다.

      • EC2 Instance Connect 엔드포인트를 추가하려면 AWS 계정에서 다음 단계를 수행하십시오.

        1. 왼쪽 탐색에서 VPC » Endpoints 로 이동합니다.

        2. Create Endpoint 를 선택합니다.

        3. 엔드포인트 유형을 EC2Instance Connect 엔드포인트로 선택합니다.

        4. VPC 을 선택합니다. 기본 VPC 보안 그룹을 사용하려면 모든 보안 그룹을 선택하지 않은 상태로 두십시오.

        5. 서브넷을 선택할 때는 CloudFormation 매개 변수에서 Private Subnet 1과 동일한 값을 사용하십시오.

        6. Create 를 선택합니다. 엔드포인트가 생성되는 데는 약 5분이 걸립니다.

    8. Openflow Agent의 Terraform 상태, 로그, 출력을 저장하는 S3 버킷입니다

  2. Openflow 배포 에이전트는 다음을 생성합니다.

    1. EKS 클러스터에는 다음이 포함됩니다.

    • 노드 그룹

    • 자동 크기 조정 그룹

    • VPC CNI 애드온

    • EBS CSI 애드온

    1. PostgreSQL, OAuth 자격 증명 등에 대한 시크릿 관리자 레코드.

    2. AWS시크릿 관리자에서 다양한 K8 서비스 계정의 시크릿을 검색할 수 있는 IAM 정책과 역할을 확인할 수 있습니다.

    3. K8 구성 요소

    • 네임스페이스

    • 클러스터 오토스케일러

    • EBS CSI 확장 가능 저장소

    • 공개적으로 액세스 가능한 네트워크 로드 밸런서를 생성하는 AWS 로드 밸런서 컨트롤러

    • 인증서 발급자 암호화하기

    • Let’s Encrypt를 사용하도록 구성된 Nginx 수신

    • 메트릭 서버

    • Jetstack 의 인증서 관리자

    • 외부 시크릿 연산자

    • 임시, 배포 서비스 및 OIDC 의 서비스 계정

    • 일시적, 배포 서비스 및 OIDC 의 시크릿 저장소

    • 임시 및 배포 서비스에 대한 외부 시크릿입니다. OIDC 에 대한 외부 시크릿은 런타임 연산자가 생성하고 관리합니다.

    • PostgreSQL

    • 시간적

    • 런타임 노드 간 통신을 위한 자체 서명 인증서 발급자 및 수신 구성

    • Openflow 런타임 연산자

    • Openflow 배포 서비스

기본적으로 모든 AWS 계정에는 리전당 5개의 Elastic IP 주소 할당량이 있습니다. 왜냐하면 공개(IPv4) 인터넷 주소는 희소성 있는 공공 자원이기 때문입니다. Snowflake는 인스턴스 장애 발생 시 주소를 다른 인스턴스로 리매핑하는 기능을 위해 주로 Elastic IP 주소를 사용하고 다른 모든 노드 간 통신에는 DNS 호스트 이름을 사용할 것을 강력히 권장합니다.

설치 진행 상황 추적하기

CloudFormation 스택이 CREATE_COMPLETE 상태로 이동하면 Openflow 에이전트가 나머지 인프라를 자동으로 생성합니다.

다음과 같이 각각 10~15분 정도 소요될 수 있는 몇 가지 단계가 있습니다.

  1. EKS 클러스터 생성하기

  2. EKS 클러스터에 EBS CSI 애드온 설치하기

  3. RDS PostgreSQL 데이터베이스 생성하기

Openflow 에이전트에 대한 상태 보고는 아직 사용할 수 없습니다. 그동안 Openflow 에이전트에서 로그를 확인하여 BYOC 배포가 런타임에 준비되었는지 확인할 수 있습니다. 이렇게 하려면 다음 단계를 수행하십시오.

  1. EC2 인스턴스 목록에서 다음 두 인스턴스를 찾습니다.

    • Openflow-agent-{data-plane-key}: 런타임을 관리하는 데 사용할 Openflow 에이전트입니다

    • {data-plane-key}-mgmt-group: BYOC 배포의 EKS 클러스터에서 연산자 및 기타 주요 소프트웨어를 실행하는 노드입니다

  2. Openflow-agent-{data-plane-key} 인스턴스를 마우스 오른쪽 버튼으로 클릭하고 Connect 를 선택합니다.

  3. EC2 Instance Connect 에서 Connect using EC2 Instance Connect Endpoint 로 변환합니다. 기본값인 EC2 Instance Connect 엔드포인트를 그대로 둡니다.

  4. Connect 을 클릭합니다. 명령줄 인터페이스가 있는 새 브라우저 탭 또는 윈도우가 표시됩니다.

  5. 다음 명령을 실행하여 배포를 구성하고 있는 docker 이미지의 설치 로그를 추적합니다.

    journalctl -xe -f -n 100 -u docker
    
    Copy
  6. 설치가 완료되면 다음과 같은 출력이 표시됩니다.

    {timestamp} - app stack applied successfully
    {timestamp} - All resources applied successfully
    

구성된 AWS 권한

이 섹션에는 Openflow BYOC 스택에서 역할에 따라 구성된 AWS 권한이 나열되어 있습니다.

참고

{key} 는 특정 배포를 위해 Openflow에서 생성 및 관리되는 클라우드 리소스를 고유하게 식별하는 배포 키를 나타냅니다.

관리 사용자

cloudformation 및 다음의 모든 권한.

IAM 역할: openflow-agent-role-{key}

{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "autoscaling:DescribeTags",
               "ec2:DescribeImages",
               "ec2:DescribeInstances",
               "ec2:DescribeLaunchTemplates",
               "ec2:DescribeLaunchTemplateVersions",
               "ec2:DescribeNetworkInterfaces",
               "ec2:DescribeSecurityGroups",
               "ec2:DescribeSubnets",
               "ec2:DescribeTags",
               "ec2:DescribeVolumes",
               "ec2:DescribeVpcs",
               "ec2:DescribeVpcAttribute",
               "iam:GetRole",
               "iam:GetOpenIDConnectProvider",
               "ecr:GetAuthorizationToken",
               "ec2:RunInstances",
               "ec2:CreateLaunchTemplate",
               "ec2:CreateSecurityGroup",
               "ec2:CreateTags",
               "ec2:DeleteTags"
            ],
            "Resource": "*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/Name": [
                        "{key}-oidc-provider"
                  ]
               }
            },
            "Action": [
               "iam:CreateOpenIDConnectProvider",
               "iam:DeleteOpenIDConnectProvider",
               "iam:TagOpenIDConnectProvider"
            ],
            "Resource": "arn:aws:iam::{Account_ID}:oidc-provider/oidc.eks.{Region}.amazonaws.com/id/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "iam:DeletePolicy",
               "iam:CreatePolicy",
               "iam:GetPolicy",
               "iam:GetPolicyVersion",
               "iam:ListPolicyVersions"
            ],
            "Resource": [
               "arn:aws:iam::{Account_ID}:policy/dp-service-role-policy-{key}",
               "arn:aws:iam::{Account_ID}:policy/oauth2-role-policy-{key}",
               "arn:aws:iam::{Account_ID}:policy/temporal-service-role-policy-{key}",
               "arn:aws:iam::{Account_ID}:policy/oidc-service-role-policy-{key}",
               "arn:aws:iam::{Account_ID}:policy/dps-temporal-role-policy-{key}"
               "arn:aws:iam::{Account_ID}:policy/dps-postgres-role-policy-{key}"
            ],
            "Effect": "Allow"
      },
      {
            "Action": [
               "iam:UpdateAssumeRolePolicy",
               "iam:PutRolePolicy",
               "iam:ListInstanceProfilesForRole",
               "iam:ListAttachedRolePolicies",
               "iam:ListRolePolicies",
               "iam:GetRolePolicy",
               "iam:CreateRole",
               "iam:AttachRolePolicy",
               "iam:DeleteRole",
               "iam:DeleteRolePolicy",
               "iam:DetachRolePolicy",
               "iam:TagRole"
            ],
            "Resource": [
               "arn:aws:iam::{Account_ID}:role/openflow-agent-role-{key}",
               "arn:aws:iam::{Account_ID}:role/{key}-*",
               "arn:aws:iam::{Account_ID}:role/dps-temporal-role-{key}",
               "arn:aws:iam::{Account_ID}:role/dps-postgres-role-{key}",
               "arn:aws:iam::{Account_ID}:role/dp-service-role-{key}",
               "arn:aws:iam::{Account_ID}:role/oauth2-role-{key}",
               "arn:aws:iam::{Account_ID}:role/oidc-service-role-{key}"
            ],
            "Effect": "Allow"
      },
      {
            "Action": [
               "autoscaling:CreateOrUpdateTags",
               "autoscaling:DeleteTags"
            ],
            "Resource": "arn:aws:autoscaling:{Region}:{Account_ID}:autoScalingGroup:*:autoScalingGroupName/eks-{key}-*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/Name": [
                        "{key}-EC2SecurityGroup-*",
                        "k8s-traffic-{key}-*",
                        "eks-cluster-sg-{key}-*",
                        "{key}-cluster-sg",
                        "postgres-{key}-sg"
                  ]
               }
            },
            "Action": [
               "ec2:AuthorizeSecurityGroupEgress",
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:RevokeSecurityGroupEgress",
               "ec2:DeleteSecurityGroup",
               "ec2:CreateTags",
               "ec2:DeleteTags",
               "ec2:CreateNetworkInterface",
               "ec2:DeleteNetworkInterface"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:security-group/*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "{key}"
               }
            },
            "Action": [
               "ec2:AuthorizeSecurityGroupEgress",
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:RevokeSecurityGroupEgress",
               "ec2:DeleteSecurityGroup",
               "ec2:CreateTags",
               "ec2:DeleteTags",
               "ec2:CreateNetworkInterface",
               "ec2:DeleteNetworkInterface"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:security-group/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "ec2:CreateSecurityGroup"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:vpc/vpc-018d2da0fde903de4",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/Name": "openflow-agent-{key}"
               }
            },
            "Action": [
               "ec2:AttachNetworkInterface"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:instance/*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/Name": "{key}-*-group"
               }
            },
            "Action": [
               "ec2:DeleteLaunchTemplate"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:launch-template/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "eks:CreateCluster",
               "eks:CreateAccessEntry",
               "eks:CreateAddon",
               "eks:CreateNodegroup",
               "eks:DeleteCluster",
               "eks:DescribeCluster",
               "eks:ListClusters",
               "eks:ListNodeGroups",
               "eks:DescribeUpdate",
               "eks:UpdateClusterConfig",
               "eks:TagResource"
            ],
            "Resource": "arn:aws:eks:{Region}:{Account_ID}:cluster/{key}",
            "Effect": "Allow"
      },
      {
            "Action": [
               "eks:DescribeAddon",
               "eks:DescribeAddonVersions",
               "eks:UpdateAddon",
               "eks:DeleteAddon",
               "eks:DescribeUpdate"
            ],
            "Resource": "arn:aws:eks:{Region}:{Account_ID}:addon/{key}/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "eks:DeleteNodegroup",
               "eks:DescribeNodegroup",
               "eks:ListNodegroups",
               "eks:UpdateNodegroupConfig",
               "eks:TagResource",
               "eks:DescribeUpdate"
            ],
            "Resource": "arn:aws:eks:{Region}:{Account_ID}:nodegroup/{key}/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "s3:CreateBucket",
               "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::byoc-tf-state-{key}",
            "Effect": "Allow"
      },
      {
            "Action": [
               "s3:DeleteObject",
               "s3:GetObject",
               "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::byoc-tf-state-{key}/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "secretsmanager:CreateSecret",
               "secretsmanager:DeleteSecret",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:GetSecretValue",
               "secretsmanager:PutSecretValue",
               "secretsmanager:UpdateSecretVersionStage"
            ],
            "Resource": "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:*-{key}*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "ecr:BatchCheckLayerAvailability",
               "ecr:BatchGetImage",
               "ecr:DescribeImages",
               "ecr:DescribeRepositories",
               "ecr:GetDownloadUrlForLayer",
               "ecr:ListImages"
            ],
            "Resource": "arn:aws:ecr:{Region}:{Account_ID}:*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "ecr:CreateRepository",
               "ecr:CompleteLayerUpload",
               "ecr:InitiateLayerUpload",
               "ecr:PutImage",
               "ecr:UploadLayerPart"
            ],
            "Resource": "arn:aws:ecr:{Region}:{Account_ID}:repository/snowflake-openflow/*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "iam:AWSServiceName": "eks.amazonaws.com"
               }
            },
            "Action": [
               "iam:CreateServiceLinkedRole"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/eks.amazonaws.com/AWSServiceRoleForAmazonEKS",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "iam:AWSServiceName": "eks-nodegroup.amazonaws.com"
               }
            },
            "Action": [
               "iam:CreateServiceLinkedRole"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup",
            "Effect": "Allow"
      },
      {
            "Action": [
               "eks:AssociateAccessPolicy",
               "eks:ListAssociatedAccessPolicies",
               "eks:DisassociateAccessPolicy"
            ],
            "Resource": "arn:aws:eks:{Region}:{Account_ID}:access-entry/{key}/*",
            "Effect": "Allow"
      },
      {
            "Action": "iam:PassRole",
            "Resource": "*",
            "Effect": "Allow"
      }
   ]
}
Copy

IAM 역할: {key}-cluster-ServiceRole

AWS 관리 정책:

  • AmazonEKSClusterPolicy

  • AmazonEKSVPCResourceController

{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "cloudwatch:PutMetricData"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "ec2:DescribeAccountAttributes",
               "ec2:DescribeAddresses",
               "ec2:DescribeInternetGateways"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
Copy

IAM 역할: {key}-addon-vpc-cni-Role

AWS 관리 정책:

  • AmazonEKS_CNI_Policy

IAM 역할: {key}-eks-role

AWS 관리 정책:

  • AmazonEBSCSIDriverPolicy

  • AmazonEC2ContainerRegistryReadOnly

  • AmazonEKS_CNI_Policy

  • AmazonEKSWorkerNodePolicy

  • AmazonSSMManagedInstanceCore

  • AutoScalingFullAccess

  • ElasticLoadBalancingFullAccess

{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "ec2:CreateSecurityGroup",
               "ec2:CreateTags"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:ec2:{Region}:{Account_ID}:security-group/*",
               "arn:aws:ec2:{Region}:{Account_ID}:vpc/{VPC_ID}"
            ],
            "Sid": "CreateOpenflowEKSSecurityGroupAndTags"
      },
      {
            "Action": [
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:DeleteSecurityGroup"
            ],
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/Name": "eks-cluster-sg-{key}-*"
               }
            },
            "Effect": "Allow",
            "Resource": [
               "arn:aws:ec2:{Region}:{Account_ID}:security-group/*"
            ],
            "Sid": "OpenflowManageEKSSecurityGroup"
      }
   ]
}
Copy

참고

{VPC_ID} 는 BYOC 에 의해 생성되었거나 BYO - VPC 에 의해 사용되는 VPC 의 식별자를 나타냅니다.

IAM 역할: oidc-service-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:oidc-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM 역할: dps-postgres-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:postgres_creds-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM 역할: dps-temporal-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:temporal_creds-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM 역할: dp-service-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:dps_creds-{key}*",
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:snowflake-oauth2-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM 역할: oauth2-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:snowflake-oauth2-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM 역할: {key}-nodegroup-NodeInstanceRole

AWS 관리 정책:

  • AmazonEBSCSIDriverPolicy

  • AmazonEC2ContainerRegistryReadOnly

  • AmazonEKS_CNI_Policy

  • AmazonEKSWorkerNodePolicy

  • AmazonSSMManagedInstanceCore

  • AutoScalingFullAccess

  • ElasticLoadBalancingFullAccess

{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "servicediscovery:CreateService",
               "servicediscovery:DeleteService",
               "servicediscovery:GetService",
               "servicediscovery:GetInstance",
               "servicediscovery:RegisterInstance",
               "servicediscovery:DeregisterInstance",
               "servicediscovery:ListInstances",
               "servicediscovery:ListNamespaces",
               "servicediscovery:ListServices",
               "servicediscovery:GetInstancesHealthStatus",
               "servicediscovery:UpdateInstanceCustomHealthStatus",
               "servicediscovery:GetOperation",
               "route53:GetHealthCheck",
               "route53:CreateHealthCheck",
               "route53:UpdateHealthCheck",
               "route53:ChangeResourceRecordSets",
               "route53:DeleteHealthCheck",
               "appmesh:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "autoscaling:DescribeAutoScalingGroups",
               "autoscaling:DescribeAutoScalingInstances",
               "autoscaling:DescribeLaunchConfigurations",
               "autoscaling:DescribeScalingActivities",
               "autoscaling:DescribeTags",
               "ec2:DescribeInstanceTypes",
               "ec2:DescribeLaunchTemplateVersions"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "autoscaling:SetDesiredCapacity",
               "autoscaling:TerminateInstanceInAutoScalingGroup",
               "ec2:DescribeImages",
               "ec2:GetInstanceTypesFromInstanceRequirements",
               "eks:DescribeNodegroup"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "iam:CreateServiceLinkedRole"
            ],
            "Condition": {
               "StringEquals": {
                  "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DescribeAccountAttributes",
               "ec2:DescribeAddresses",
               "ec2:DescribeAvailabilityZones",
               "ec2:DescribeInternetGateways",
               "ec2:DescribeVpcs",
               "ec2:DescribeVpcPeeringConnections",
               "ec2:DescribeSubnets",
               "ec2:DescribeSecurityGroups",
               "ec2:DescribeInstances",
               "ec2:DescribeNetworkInterfaces",
               "ec2:DescribeTags",
               "ec2:GetCoipPoolUsage",
               "ec2:DescribeCoipPools",
               "elasticloadbalancing:DescribeLoadBalancers",
               "elasticloadbalancing:DescribeLoadBalancerAttributes",
               "elasticloadbalancing:DescribeListeners",
               "elasticloadbalancing:DescribeListenerCertificates",
               "elasticloadbalancing:DescribeSSLPolicies",
               "elasticloadbalancing:DescribeRules",
               "elasticloadbalancing:DescribeTargetGroups",
               "elasticloadbalancing:DescribeTargetGroupAttributes",
               "elasticloadbalancing:DescribeTargetHealth",
               "elasticloadbalancing:DescribeTags"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "cognito-idp:DescribeUserPoolClient",
               "acm:ListCertificates",
               "acm:DescribeCertificate",
               "iam:ListServerCertificates",
               "iam:GetServerCertificate",
               "waf-regional:GetWebACL",
               "waf-regional:GetWebACLForResource",
               "waf-regional:AssociateWebACL",
               "waf-regional:DisassociateWebACL",
               "wafv2:GetWebACL",
               "wafv2:GetWebACLForResource",
               "wafv2:AssociateWebACL",
               "wafv2:DisassociateWebACL",
               "shield:GetSubscriptionState",
               "shield:DescribeProtection",
               "shield:CreateProtection",
               "shield:DeleteProtection"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:RevokeSecurityGroupIngress"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:CreateSecurityGroup"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:CreateTags"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
               },
               "StringEquals": {
                  "ec2:CreateAction": "CreateSecurityGroup"
               }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:*:*:security-group/*"
      },
      {
            "Action": [
               "ec2:CreateTags",
               "ec2:DeleteTags"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:*:*:security-group/*"
      },
      {
            "Action": [
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:RevokeSecurityGroupIngress",
               "ec2:DeleteSecurityGroup"
            ],
            "Condition": {
               "Null": {
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "elasticloadbalancing:CreateLoadBalancer",
               "elasticloadbalancing:CreateTargetGroup"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "elasticloadbalancing:CreateListener",
               "elasticloadbalancing:DeleteListener",
               "elasticloadbalancing:CreateRule",
               "elasticloadbalancing:DeleteRule"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "elasticloadbalancing:AddTags",
               "elasticloadbalancing:RemoveTags"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": [
               "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
               "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*",
               "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*"
            ]
      },
      {
            "Action": [
               "elasticloadbalancing:AddTags",
               "elasticloadbalancing:RemoveTags"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:elasticloadbalancing:*:*:listener/net/*/*/*",
               "arn:aws:elasticloadbalancing:*:*:listener/app/*/*/*",
               "arn:aws:elasticloadbalancing:*:*:listener-rule/net/*/*/*",
               "arn:aws:elasticloadbalancing:*:*:listener-rule/app/*/*/*"
            ]
      },
      {
            "Action": [
               "elasticloadbalancing:ModifyLoadBalancerAttributes",
               "elasticloadbalancing:SetIpAddressType",
               "elasticloadbalancing:SetSecurityGroups",
               "elasticloadbalancing:SetSubnets",
               "elasticloadbalancing:DeleteLoadBalancer",
               "elasticloadbalancing:ModifyTargetGroup",
               "elasticloadbalancing:ModifyTargetGroupAttributes",
               "elasticloadbalancing:DeleteTargetGroup"
            ],
            "Condition": {
               "Null": {
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "elasticloadbalancing:AddTags"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
               },
               "StringEquals": {
                  "elasticloadbalancing:CreateAction": [
                        "CreateTargetGroup",
                        "CreateLoadBalancer"
                  ]
               }
            },
            "Effect": "Allow",
            "Resource": [
               "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
               "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*",
               "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*"
            ]
      },
      {
            "Action": [
               "elasticloadbalancing:RegisterTargets",
               "elasticloadbalancing:DeregisterTargets"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*"
      },
      {
            "Action": [
               "elasticloadbalancing:SetWebAcl",
               "elasticloadbalancing:ModifyListener",
               "elasticloadbalancing:AddListenerCertificates",
               "elasticloadbalancing:RemoveListenerCertificates",
               "elasticloadbalancing:ModifyRule"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:ChangeResourceRecordSets"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:route53:::hostedzone/*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:GetChange"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:route53:::change/*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:ListResourceRecordSets",
               "route53:ListHostedZonesByName"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "ec2:CreateSnapshot",
               "ec2:AttachVolume",
               "ec2:DetachVolume",
               "ec2:ModifyVolume",
               "ec2:DescribeAvailabilityZones",
               "ec2:DescribeInstances",
               "ec2:DescribeSnapshots",
               "ec2:DescribeTags",
               "ec2:DescribeVolumes",
               "ec2:DescribeVolumesModifications"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:CreateTags"
            ],
            "Condition": {
               "StringEquals": {
                  "ec2:CreateAction": [
                        "CreateVolume",
                        "CreateSnapshot"
                  ]
               }
            },
            "Effect": "Allow",
            "Resource": [
               "arn:aws:ec2:*:*:volume/*",
               "arn:aws:ec2:*:*:snapshot/*"
            ]
      },
      {
            "Action": [
               "ec2:DeleteTags"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:ec2:*:*:volume/*",
               "arn:aws:ec2:*:*:snapshot/*"
            ]
      },
      {
            "Action": [
               "ec2:CreateVolume"
            ],
            "Condition": {
               "StringLike": {
                  "aws:RequestTag/ebs.csi.aws.com/cluster": "true"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:CreateVolume"
            ],
            "Condition": {
               "StringLike": {
                  "aws:RequestTag/CSIVolumeName": "*"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteVolume"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/ebs.csi.aws.com/cluster": "true"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteVolume"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/CSIVolumeName": "*"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteVolume"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/kubernetes.io/created-for/pvc/name": "*"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteSnapshot"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/CSIVolumeSnapshotName": "*"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteSnapshot"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/ebs.csi.aws.com/cluster": "true"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:ChangeResourceRecordSets"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:route53:::hostedzone/*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:ListHostedZones",
               "route53:ListResourceRecordSets",
               "route53:ListTagsForResource"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
Copy