우선 AWS EFS에서 간단한 설정으로 기본 EFS를 만들어 주도록 하겠습니다.
사용자가 1명인 만큼, 소유자도 1명으로 지정해줍니다. 이는 기본값들이므로 그냥 외우면 됩니다.
그리고 네트워크 텝에 들어가면 각 VPC의 서브넷에 보안그룹이 할당되어 있는데, Lambda Function을 만들 떄 보안그룹을 설정할 떄 이로 무조건 설정해 주어야 합니다.
다음으로는 AWS Lambda로 돌아와서 functionforefs라는 함수를 하나 만들어 주었습니다.
그리고 구성 > 권한으로 들어가서 기본적으로 만들어주는 권한을 확인합니다.
이에 정책 하나가 있는데 이 정책을 확인해 보면
다음과 같이 CloudWatch에 대한 정책밖에 없습니다. 진짜 아무것도 아닌 겁니다.
우선 EFS도 VPC가 하나이긴 하지만, VPC로 들어가서 파일시스템을 조작해야 하는 것이므로 AmazonVPCFullAccess정책을 하나 연결해 주었습니다.
그리고 EFS에 Read, Write하기 위해서 AmazonElasticFileSystemClientReadWriteAccess정책을 추가로 연결해 주었습니다.
그 다음으로는 Lambda Function의 VPC를 편집해 주도록 하겠습니다.
위와같이 EFS에서 설정해 주었던 VPC를 설정해 주었습니다. 그리고 Subnet은 그냥 다 선택해 주었습니다.
또한 보안그룹은 EFS에서 제가 무조건 이걸로 선택해야 한다 했던걸로 선택해주면, 인바운드, 아웃바운드 규칙이 모든 소스로부터 허용을 하는 것을 보실 수 있을겁니다.
그리고 마지막으로 파일시스템을 추가했습니다. 이전에 만든 first라는 EFS와 이전에 만들었던 엑세스 포인트엔 Message를 지정해 주었고, 로컬 탑재 경로는 아직 뭔지 모르겠지만 /mnt/msg로 설정해 주었습니다.
이에 대한 답은 아래 블로그를 참조하시면 좋을 것 같습니다 대충 EFS안에서의 경로를 설정해 주는 것 같습니다.
https://aws.amazon.com/ko/blogs/korea/new-a-shared-file-system-for-your-lambda-functions/
이 다음에는 이제 Function 코드를 수정해 보도록 하겠습니다. 이는 위 공식문서 그대로 작성한 것입니다.
functionforefs Function
import os
import fcntl
MSG_FILE_PATH = '/mnt/msg/content'
def get_messages():
try:
with open(MSG_FILE_PATH, 'r') as msg_file:
fcntl.flock(msg_file, fcntl.LOCK_SH)
messages = msg_file.read()
fcntl.flock(msg_file, fcntl.LOCK_UN)
except:
messages = 'No message yet.'
return messages
def add_message(new_message):
with open(MSG_FILE_PATH, 'a') as msg_file:
fcntl.flock(msg_file, fcntl.LOCK_EX)
msg_file.write(new_message + "\n")
fcntl.flock(msg_file, fcntl.LOCK_UN)
def delete_messages():
try:
os.remove(MSG_FILE_PATH)
except:
pass
def lambda_handler(event, context):
print(event)
method = event['requestContext']['http']['method']
if method == 'GET':
messages = get_messages()
elif method == 'POST':
new_message = event['body']
add_message(new_message)
messages = get_messages()
elif method == 'DELETE':
delete_messages()
messages = 'Messages deleted.'
else:
messages = 'Method unsupported.'
return messages
코드는 대충 lambda_handler를 위한 메세지 가져오기, 추가, 삭제 함수가 있는 것 같습니다. GET요청이 오면 get_message로 파일에 쓰여진 파일을 읽고, 만약에 파일에 아무 내용도 없으면 "No message yet"을 띄우는 것 같습니다. 그리고 POST요청과 body데이터가 오면 body데이터의 내용을 파일에 쓰고 추가한 데이터 까지 저장한 내용을 출력하는 것 같습니다. 마지막으로 DELETE요청을 하면 delete_message함수가 호출되어, 파일에 저장된 내용이 초기화 되는 것같습니다.
이를 이제 직접 HTTP API Gateway를 만들어 확인해 보도록 하겠습니다.
간단히 efs_test라는 HTTP API Gateway를 만들었습니다.
경로는 ANY에 대해서 처리를 해주었습니다.
그리고 이를 curl을 통해서 EFS에 파일들이 잘 저장되는지 결괏값을 통해서 확인해 보도록 하겠습니다.
완벽히 정상적으로 동작하는 것을 보실 수 있습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (AWS Lambda) Lambda Step Functions 구현 (0) | 2022.07.20 |
---|---|
[ DevOps ] - (AWS Lambda) Step Functions 권한 설정 (0) | 2022.07.20 |
[ DevOps ] - (AWS Lambda) Layers (0) | 2022.07.19 |
[ DevOps ] - (AWS Lambda) 환경변수 설정 (0) | 2022.07.19 |
[ DevOps ] - (AWS Lambda) 버전관리와 Alias (0) | 2022.07.19 |