본문 바로가기
개발/AWS

EC2 Node서버에서 Lambda 접근하기 + secretAccessKey 관리

by 문둘기 2019. 10. 18.

최근에 EC2 에 Node 소켓서버를 만들고 서버에서 Lambda함수를 호출해야되는 일이 생겼다.

node서버는 Lambda에게 단순하게 값을 보내는 역할만 하면 되고, 나머지 로직은 Lambda가 데이터를 받아서 알아서 처리하게 할것이다.

처음에는 API Gateway를 이용해서 URL을 통해 접근할생각이었으나.. 찾아보니 aws-sdk 를 이용하면 EC2 node서버에서 Lambda를 바로 호출할수있다는것을 알게되었다. 일단 aws-sdk 를 설치하고 node서버에서 람다를 호출하는 예제를 찾아서 적용 해봤는데 잘 작동했다.

아래코드는 nodejs TCP 소켓서버에서 람다와 관련된부분만 적어놓은것이다

//server.js

const AWS = require('aws-sdk');//SDK require

AWS.config.update({
accessKeyId: '************',
secretAccessKey: '************************',
region: 'ap-northeast-2'
});

const lambda = new AWS.Lambda();

//람다에 보낼 파라미터 작성const params = {
    FunctionName: '함수이름',
    Payload: JSON.stringify({'test' : test })
};

//람다 호출하기 , 호출 성공하면 return 받은 값 출력
lambda.invoke(params, function (err, data) {
    if (err) console.log(err, err.stack);
    else console.log(data);
});

다만 문제가 하나 있었는데,

AWS.config.update({
  accessKeyId: '************',
  secretAccessKey: '************************',
  region: 'ap-northeast-2',
});

이런식으로 server.js 파일 시작부분에 secretAccessKey가 하드코딩 되어있다는것이다.

예제 코드에도 주석으로 secretAccessKey는 하드코딩하지말고 따로 관리해라 라고 써있었다.

secretAccessKey를 털리면 해커가 시간당 수백만원씩 나가는 비싼 EC2를 맘대로 생성할수 있기때문에 절대 유출되면안된다.. 최악의경우에는 AWS에 올려놓은 서비스 리소스들을 다 날려먹을수도있다. (특히 DB)

다른방법을 찾아보던중 IAM Role을 EC2에게 부여하는 방법이 있다는것을 알게되었다. 이건 EC2 자체가 특정 권한을 가지게되는것이다. 나는 EC2가 Lambda에서 단하나의 함수에만 접근할수있게 권한을 설정하고 EC2에게 부여하는식으로 진행했다.

우선 사용할 람다 함수를 생성해놓고, IAM의 정책생성에서 정책을 생성한다.

사용할 서비스 - Lambda

작업 - InvokeFunction

리소스를 특정에 체크하면 function 부분에서 추가작업을 하라고하는데 특정 람다 어떤걸 호출하게 할거냐?? 물어보는것이다. ARN추가를누르면 창이뜨게되는데, 람다의 ARN은 해당 람다함수페이지의 우측상단에서 볼수있다 ARN 복붙하면 알아서 Region, Account, Function name 이 적용된다. 그다음 정책이름을 정하고 정책생성을하면 된다.

이제 해당 정책으로 역할을 생성해야된다. 역할을 사용할 서비스는 당연히 EC2를 선택하면된다. 방금만든 정책을 연결하고 역할을 생성하자.

마지막으로 방금 생성한 역할을 EC2에 연결해주면 끝이다.

EC2 인스턴스 → 작업 → 인스턴스 설정 → IAM역할 연결/바꾸기

이제 역할 선택하고 적용하면 끝 !! 여기까지 완료했다면 서버의 JS 파일에서 accessKeyId 와 secretAccessKey를 제거해도 정상적으로 작동한다.

AWS.config.update({
  region: 'ap-northeast-2',
});

근데 region까지 없애면 작동안하길래 region은 일단 냅뒀음. 아마 저것도 따로 설정하면 코드에서 지울수있을것이다.


좋은 방법이 있으면 조언 부탁드립니다.