ECS]Envoy를 에지 에이전트로 AWS 서비스에 연결하는 방법(2)

10375 단어 AWSECSenvoytech

개요


ECS에서 시작하는 Envoy 컨테이너를 에지 에이전트로 AWS 서비스에 액세스하는 방법 정리
이 기사는 Cognito에서 액세스한 토큰을 확인합니다.
사용저번 보도 환경

용기의 제작


샘플 코드 여기 있습니다.
https://github.com/tubame0505/envoy_aws_request_signing_sample/tree/main/docker_jwt
Port10000은 S3 서비스의 청취자입니다.
Port 10001은 Api Gateway 서비스의 청취자입니다.
S3 설정 발췌
Jwt Authentication 필터로 서명, 유효기간, iss 유효성 검사, "payload in metadata: jwt-payload"에 Dynamic Metadata에 정보 저장
이 정보를 참조하여 Lua 필터 client인증 id, scope
https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/jwt_authn_filter
https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/lua_filter
  • envoy 설정
  •           http_filters:
              - name: envoy.filters.http.jwt_authn
                typed_config:
                  '@type': type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication
                  providers:
                    cognito:
                      issuer: "${JWT_ISSUER}"
                      forward_payload_header: jwt-payload
                      payload_in_metadata: jwt-payload
                      remote_jwks:
                        http_uri:
                          uri: "${JWT_JWK_URI}"
                          cluster: jwks
                          timeout: 5s
                        cache_duration: 600s
                  rules:
                  - match:
                      prefix: '/'
                    requires:
                      provider_name: cognito
              - name: envoy.filters.http.lua
                typed_config:
                  '@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
                  inline_code: |
                    -- Called on the request path.
                    function envoy_on_request(request_handle)
                      -- Do something.
                      local jwt_client = request_handle:streamInfo():dynamicMetadata():get('envoy.filters.http.jwt_authn')['jwt-payload']['client_id']
                      local jwt_scope = request_handle:streamInfo():dynamicMetadata():get('envoy.filters.http.jwt_authn')['jwt-payload']['scope']
                      if jwt_client == nil or jwt_client ~= '"${JWT_CLIENT}"' then
                        request_handle:respond({[':status'] = '401'}, 'unauthorized_client_error:')
                      end
                      if jwt_scope == nil or jwt_scope ~= 's3/access' then
                        request_handle:respond({[':status'] = '401'}, 'unauthorized_scope_error')
                      end
                    end
    

    컨테이너의 실행


    ECS를 사용하지 않고 로컬에서 확인 작업을 시작할 수 있습니다.
    export AWS_ACCESS_KEY_ID=xxxxxx
    export AWS_SECRET_ACCESS_KEY=xxxxxx
    export AWS_S3_ENDPOINT=samplebktenvoytest.s3.ap-northeast-1.amazonaws.com
    export AWS_APIGW_ENDPOINT=apigwid.execute-api.ap-northeast-1.amazonaws.com
    export AWS_REGION=ap-northeast-1
    export JWT_ISSUER=https://cognito-idp.ap-northeast-1.amazonaws.com/userpoolid
    export JWT_CLIENT=client_id
    export JWT_JWK_URI=https://cognito-idp.ap-northeast-1.amazonaws.com/userpoolid/.well-known/jwks.json
    export JWT_ISSUER_HOST=cognito-idp.ap-northeast-1.amazonaws.com
    
    docker build -t envoy:v1 .
    docker run --rm --name envoy -p 9901:9901 -p 10000:10000 -p 10001:10001 -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY -e AWS_S3_ENDPOINT=$AWS_S3_ENDPOINT -e AWS_REGION=$AWS_REGION -e AWS_APIGW_ENDPOINT=$AWS_APIGW_ENDPOINT -e JWT_ISSUER=$JWT_ISSUER -e JWT_CLIENT=$JWT_CLIENT -e JWT_JWK_URI=$JWT_JWK_URI -e JWT_ISSUER_HOST=$JWT_ISSUER_HOST envoy:v1
    
    추가 케이스로 연결 확인
    curl -H 'Authorization: Bearer accesstoken_string' http://localhost:10000/test.txt
    
    curl -H 'Authorization: Bearer accesstoken_string' -H 'Content-type: application/json' -d '{"Name": "Jone"}' http://localhost:10001/proxy-test
    
    후속 기사에 SSL 설정이 기재되어 있음

    관련 보도

  • ECS]Envoy를 에지 에이전트로 AWS 서비스에 연결하는 방법(1)
  • 참조 링크

  • » Configuration reference » HTTP » HTTP filters » JWT Authentication
  • » Configuration reference » HTTP » HTTP filters » Lua
  • envoy의 JWT 인증
  • 좋은 웹페이지 즐겨찾기