AWS CDK Lambda & Athena

2022. 4. 26. 13:06it

반응형

CDK Module 선분석

  • 이렇게 CFN-resource만 있으므로 이 CDK code는 CloudFormation (CFN)의 wrapper 수준이라는 것을 알 수 있습니다. 자세한 사항은 CFN의 Athena module을 참고해야 합니다.
  • 중요한 class는 다음과 같이 4개가 나오는데요. 이것들이 각각 무엇을 하는 class인지 알아봅니다.
  • Resource types
    • AWS::Athena::DataCatalog
      • The AWS::Athena::DataCatalog resource specifies an Amazon Athena data catalog, which contains a name, description, type, parameters, and tags. For more information, see DataCatalog in the Amazon Athena API Reference.
    • AWS::Athena::NamedQuery
      • The AWS::Athena::NamedQuery resource specifies an Amazon Athena saved query, where QueryString is the list of SQL query statements that comprise the query.
    • AWS::Athena::PreparedStatement
      • Specifies a prepared statement for use with SQL queries in Athena.
    • AWS::Athena::WorkGroup
      • The AWS::Athena::WorkGroup resource specifies an Amazon Athena workgroup, which contains a name, description, creation time, state, and other configuration, listed under WorkGroupConfiguration. Each workgroup enables you to isolate queries for you or your group from other queries in the same account. For more information, see CreateWorkGroup in the Amazon Athena API Reference.

 

Boto3 Athena 선분석

  • 그런데 생각을 해보면 우리는 이미 짜여진 SQL query를 다시 돌리는 것이 아니라 user가 변경할 수 있는 SQL query를 lambda에서 dynamic하게 call을 해주는 것이기 때문에 boto3 level에서 이해할 필요가 있다.
  • Athena — Boto3 Docs 1.21.43 documentation
  • 여기에서 보면 다음과 같이 SQL query를 실행하는 것을 알 수 있다.
  • Athena — Boto3 Docs 1.21.42 documentation
  • Runs the SQL query statements contained in the Query . Requires you to have access to the workgroup in which the query ran. Running queries against an external catalog requires GetDataCatalog permission to the catalog. For code samples using the Amazon Web Services SDK for Java, see Examples and Code Samples in the Amazon Athena User Guide .
  • Request Syntax
response = client.start_query_execution(
    QueryString='string',
    ClientRequestToken='string',
    QueryExecutionContext={
        'Database': 'string',
        'Catalog': 'string'
    },
    ResultConfiguration={
        'OutputLocation': 'string',
        'EncryptionConfiguration': {
            'EncryptionOption': 'SSE_S3'|'SSE_KMS'|'CSE_KMS',
            'KmsKey': 'string'
        }
    },
    WorkGroup='string'
)
  • See also: AWS API Documentation
  • 그래서 Lambda는 결국 Athena service를 사용하면 되고 CDK는 Athena의 resource를 생성한 것은 아니기에 간단하게 CDK IAM으로 해결하는 것이 옳을 것으로 보임.

 

CDK IAM: Athena

  • 그러면 CDK IAM에서 Athena access를 주는 것을 알아보도록 하겠습니다.
  • 이런 경우 제일 편한 방법이 IAM console을 이용하는 것입니다.
  • IAM의 Policies 선택
  • Athena 검색. 다음과 같이 두 개의 policy가 나옵니다.

  • 간단하게 하려면 managed policy인 athena full access를 주고 다음의 code를 참조해서 반영을 합니다.
// packages/cdk-infra/src/stack-Glue.ts
    const role = new iam.Role(this, "my-glue-job-role", {
      assumedBy: new iam.ServicePrincipal("glue.amazonaws.com"),
    });
    const gluePolicy = iam.ManagedPolicy.fromAwsManagedPolicyName(
      "service-role/AWSGlueServiceRole"
    );
    role.addManagedPolicy(gluePolicy);
  • 좀 더 보안을 지키려면 자세한 access를 제한해서 주는 것이 좋습니다.
  • 좀 더 세밀하게 IAM policy를 주는 참고 code는 다음을 보세요.
// packages/cdk-infra/src/utils/cdk-ssm.ts
  public static GrantReadByPath(
    prefix: string,
    func: IFunction,
    region: string | undefined = process.env.CDK_DEFAULT_REGION,
    account: string | undefined = process.env.CDK_DEFAULT_ACCOUNT
  ) {
    // The policy to enable SSM parameter describe
    const pSsmDesc = new PolicyStatement();
    pSsmDesc.addActions("ssm:DescribeParameters");
    pSsmDesc.addResources("*");
    func.addToRolePolicy(pSsmDesc);

    // The policy to enable SSM Parameters Read by path
    const pSsmReadP = new PolicyStatement();
    pSsmReadP.addActions("ssm:GetParameter*");
    const resourcePath =
      "arn:aws:ssm:" + region + ":" + account + ":parameter" + prefix;
    pSsmReadP.addResources(resourcePath, resourcePath + "/*");
    func.addToRolePolicy(pSsmReadP);
  }

 

반응형