환경 변수를 사용하여 AWS Amplify Backend에 비밀을 저장하는 방법

twelve-factor app은 SaaS(software-as-a-service) 앱을 구축하기 위한 알려진 방법론입니다. 한 가지 요소는 구성을 코드와 엄격하게 분리하기 위해 애플리케이션의 구성을 코드가 아닌 환경에 저장해야 한다는 점을 설명합니다.

이 기사에서는 환경 변수 및 AWS Amplify을 사용하여 AWS Secrets Manager 백엔드에 민감한 구성 데이터와 민감하지 않은 구성 데이터를 추가하는 방법을 보여주고자 합니다.

목차

  • Types of configuration
  • Init Amplify
  • Add insensitive configuration data
  • Add sensitive data using AWS Secrets Manager
  • Conclusion

  • 구성 유형

    There exist many types of configuration data, for example:

    • timeouts
    • connection strings
    • external API configurations like URLs and endpoints
    • caching
    • hosting configuration for URL, port, or schema
    • file system paths
    • framework configuration
    • libraries configuration
    • business logic parameters
    • and many more

    Apart from the type, configuration data can also be categorized as sensitive or insensitive.

    민감한 대 둔감한

    Sensitive configuration data is anything that can be potentially exploited by a third party and therefore must be protected from unauthorized access. Examples of such sensitive data are API keys, usernames, passwords, emails, etc. This data should not be part of your version control. Insensitive configuration data is for example a timeout string for a backend endpoint that can be safely added to the version control.

    증폭 초기화

    You need an AWS account and the Amplify CLI installed and configured to be able to follow the following steps. Check out the official docs 전제 조건을 설정합니다.

    새 Amplify 프로젝트를 생성하여 시작하겠습니다.

    mkdir amplify-env-config-demo
    cd amplify-env-config-demo
    
    ▶ amplify init
    ? Enter a name for the project amplifyenvconfigdemo
    ? Initialize the project with the above configuration? Yes
    ? Select the authentication method you want to use: AWS profile
    ? Please choose the profile you want to use default
    


    다음으로 일부 환경 구성을 추가하는 데 사용할 API를 추가할 수 있습니다.

    ▶ amplify add api
    ? Please select from one of the below mentioned services: REST
    ? Provide a friendly name for your resource to be used as a label for this category in the project: amplifyenvconfigdemoapi
    ? Provide a path (e.g., /book/{isbn}): /handle
    ? Choose a Lambda source Create a new Lambda function
    ? Provide an AWS Lambda function name: amplifyenvconfigdemofunction
    ? Choose the runtime that you want to use: NodeJS
    ? Choose the function template that you want to use: Hello World
    ? Do you want to configure advanced settings? No
    ? Do you want to edit the local lambda function now? No
    ? Restrict API access No
    ? Do you want to add another path? No
    


    "Hello World"Amplify 템플릿을 기반으로 간단한Node.js 람다 함수를 생성합니다. 경로에 끝점이 있는 REST API를 제공합니다/handle.

    Amplify CLI는 amplify/backend/function/amplifyenvconfigdemofunction/src/index.js에서 "Hello World"함수 코드를 생성했습니다.

    exports.handler = async event => {
      // TODO implement
      const response = {
        statusCode: 200,
        // Uncomment below to enable CORS requests
        // headers: {
        // "Access-Control-Allow-Origin": "*",
        // "Access-Control-Allow-Headers": "*"
        // },
        body: JSON.stringify('Hello from Lambda!'),
      };
      return response;
    };
    


    중요하지 않은 구성 데이터 추가

    As we now have a running API, we can add some insensitive configuration data as environment variables to our Amplify backend.

    Therefore, we need to modify the amplify/backend/function/amplifyenvconfigdemofunction/amplifyenvconfigdemofunction-cloudformation-template.json file. It includes a Parameters object where we can add a new environment variable. In our case we want to add a string variable that can be accessed with the key MyEnvVariableKey and has the value my-environment-variable :

    {
      "AWSTemplateFormatVersion": "2010-09-09",
      "Description": "Lambda Function resource stack creation using Amplify CLI",
      "Parameters" : {
        ...
        "env": {
          "Type": "String"
        },
        "s3Key": {
          "Type": "String"
        },
        "MyEnvVariableKey" : { "Type" : "String", "Default" : "my-environment-variable" } },
      ...
    }
    

    We also need to modify the Resources > Environment > Variables object in this file to be able to map our new environment key to a variable that is attached to the global process.env variable and is injected by the Node.js runtime:

    {
      "Resources": {
        "Environment": {
          "Variables": {
            "ENV": {
              "Ref": "env"
            },
            "REGION": {
              "Ref": "AWS::Region"
            },
            "MY_ENV_VAR": { "Ref": "MyEnvVariableKey" } }
        }  
      }
    }
    

    Finally, we need to run amplify push to build all of our local backend resources and provision them in the cloud.

    Now we can access this variable in our lambda function by accessing the global process.env variable:

    exports.handler = async event => {
      console.log('MY_ENV_VAR', process.env.MY_ENV_VAR);
      const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
      };
      return response;
    };
    

    AWS Secrets Manager를 사용하여 민감한 데이터 추가

    AWS provides the AWS Secrets Manager "응용 프로그램, 서비스 및 IT 리소스에 액세스하는 데 필요한 비밀을 보호"하는 데 도움이 됩니다. 이 서비스를 사용하여 백엔드에서 민감한 데이터에 액세스할 수 있습니다.

    먼저 "새 비밀 저장"을 클릭하여 새 비밀을 생성해야 합니다.

    새 비밀 저장

    다음으로 "기타 유형의 비밀"을 클릭하고 해당 "비밀 키/값"입력에 비밀의 키와 값을 입력합니다.

    시크릿 타입

    비밀에 여러 키/값 쌍을 추가할 수 있습니다. ”+ 행 추가” 버튼을 클릭하여 새 쌍을 추가할 수 있습니다.

    다음 화면에서 비밀에 이름과 기타 선택적 정보를 추가해야 합니다.

    비밀 이름 및 설명

    "다음"버튼을 클릭하여 다음 화면을 모두 건너뛰고 마법사를 마치겠습니다.

    이제 비밀을 열고 AWS Secrets Manager 내에서 해당 값을 검사할 수 있습니다.

    비밀 정보

    Cloudformation 구성 파일amplifyenvconfigdemofunction-cloudformation-template.json에 새 구성 개체를 추가해야 하므로 "Secret ARN"값을 복사해야 합니다.

    "lambdaexecutionpolicy": {
      "DependsOn": ["LambdaExecutionRole"],
      "Type": "AWS::IAM::Policy",
      "Properties": {
      "PolicyName": "lambda-execution-policy",
      "Roles": [{ "Ref": "LambdaExecutionRole" }],
      "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            { "Effect": "Allow", "Action": ["secretsmanager:GetSecretValue"], "Resource": { "Fn::Sub": ["arn:aws:secretsmanager:${region}:${account}:secret:key_id", { "region": { "Ref": "AWS::Region" }, "account": { "Ref": "AWS::AccountId" } }] } } ]
        }
      }
    }
    
    


    다시 한 번 amplify push를 실행하여 모든 로컬 백엔드 리소스를 구축하고 클라우드에서 프로비저닝해야 합니다.

    이제 Node.js 람다 함수 내부의 비밀에 액세스할 수 있도록 JavaScript 코드를 추가해야 합니다.

    먼저 다음을 실행하여 AWS SDK를 amplify/backend/function/amplifyenvconfigdemofunction/src/package.json에 추가해야 합니다.

    npm install aws-sdk
    


    그런 다음 SecretsManager를 사용하여 AWS Secrets Manager에서 정의한 "비밀 이름"을 전달하여 비밀 값을 가져올 수 있습니다.

    const AWS = require('aws-sdk');const secretsManager = new AWS.SecretsManager();
    exports.handler = async event => {
      console.log('MY_ENV_VAR', process.env.MY_ENV_VAR);
    
      const secretData = await secretsManager .getSecretValue({ SecretId: 'dev/demoSecret' }) .promise(); const secretValues = JSON.parse(secretData.SecretString); console.log('DEMO_API_KEY', secretValues.DEMO_API_KEY);
      const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
      };
      return response;
    };
    


    결론

    In this article, I demonstrated how you can add sensitive and insensitive environment configuration to your AWS Amplify backend. You can also watch if you prefer a visual tutorial.

    If you liked this article, follow me on to get notified about new blog posts and more content from me.

    좋은 웹페이지 즐겨찾기