미래 지향적인 웹 앱 구축: The Codest의 전문가 팀이 제공하는 인사이트
The Codest가 최첨단 기술로 확장 가능한 대화형 웹 애플리케이션을 제작하고 모든 플랫폼에서 원활한 사용자 경험을 제공하는 데 탁월한 성능을 발휘하는 방법을 알아보세요. Adobe의 전문성이 어떻게 디지털 혁신과 비즈니스를 촉진하는지 알아보세요...
지난 몇 년 동안 온라인 스토리지는 확장성이 뛰어난 아키텍처, 강화된 보안, 광범위한 데이터 접근성을 제공하는 주류로 자리 잡았습니다. 가장 인기 있는 스토리지 서비스 중 하나는 S3로 널리 알려진 아마존의 심플 스토리지 서비스입니다.
Amazon S3는 Amazon Web Services의 핵심에 있는 매우 강력한 서비스입니다. 하지만 프로덕션 환경이 아닌 곳에서는 S3를 사용하기가 어려울 수 있습니다. 액세스 키를 전달하고, 사용자 계정을 프로비저닝하고, 안정적인 네트워크 연결을 유지해야 하는 것은 말할 것도 없고, 비용도 들기 때문입니다. 다행히도 이 문제를 해결하는 데 도움이 되는 도구가 있습니다. FakeS3는 실제 S3의 동작을 시뮬레이션하는 경량 서버입니다. 이 도구는 Amazon S3가 응답하는 것과 동일한 호출에 응답하고 업로드된 파일을 로컬 파일 시스템에 저장하며 Amazon 서비스에 대한 요청은 하지 않습니다. gem은 전체 S3 명령 집합을 지원하지는 않지만, 구현된 API는 대부분의 애플리케이션 사용 사례에 충분합니다.
이 글에서는 액티브 레코드에 널리 사용되는 파일 첨부 라이브러리인 Paperclip과 AWS 및 FakeS3를 통합하는 방법을 소개합니다. Paperclip과 S3를 함께 사용하면 유효성 검사 관리 및 이미지 변환과 같은 유용한 Paperclip의 핵심 기능과 온라인 스토리지의 장점을 결합한 효과적인 파일 저장 시스템을 제공합니다. 이러한 도구의 구성은 명확하지 않고 자세한 설명서를 살펴보고 여러 가지 보석 같은 문제를 해결해야 하지만, 시간을 투자하여 더 빠르고 효율적으로 개발할 가치가 있습니다.
설명된 도구를 통합하려면 세 단계를 거쳐야 합니다:
필요한 보석을 설치하는 것부터 시작하겠습니다:
# 젬파일
gem "종이 클립"
gem "aws-sdk", "~> 1.6"
gem "fakes3", 그룹: [:개발, :테스트]
aws-sdk 버전 1.6을 설치해야 합니다. SKD를 사용하여 Amazon 서비스에서 스토리지를 관리하는 Paperclip은 상위 버전에서 제대로 작동하지 않습니다. 이는 버전 2.0에서 SDK의 API가 크게 변경되었기 때문입니다.
또한 FakeS3의 주요 목표는 런타임 종속성을 최소화하는 것임을 기억하세요. 이 도구는 S3 호출을 테스트하기 위한 개발 도구에 가깝습니다. 코드 S3 기능을 복제하려는 프로덕션 서버가 아니라. 따라서 개발 및 테스트 그룹에만 gem을 포함해야 합니다.
AWS SDK는 구성 로드를 담당하는 전용 헬퍼 메서드를 제공합니다. 기본적으로 다음에서 구성을 로드합니다. config/aws.yml
를 호출하여 현재 환경에 대한 파라미터를 추출하고 이를 AWS 클라이언트에 전달합니다. 먼저 이니셜라이저에서 다음 메서드를 호출합니다:
# config/initializers/aws.rb
AWS::Rails.load_yaml_config
이제 구성 파일이 제대로 로드되었으므로 콘텐츠 지정을 진행할 수 있습니다:
# config/aws.yml
개발: &개발
access_key_id: "abc"
secret_access_key: "abc"
s3_endpoint: "localhost"
s3_port: 10001
s3_force_path_style: true
use_ssl: false
test: *개발
모든 매개 변수에 대해 하나씩 살펴 보겠습니다:
액세스_키_ID, 비밀_액세스_키
- 아마존 계정에 액세스하는 데 필요한 AWS 클라이언트 자격 증명입니다. 가짜 S3 서버에서 무시되므로 샌드박스 환경에서는 사용자 지정 값이 무시됩니다.s3_endpoint, s3_port
- S3 엔드포인트 사양. 이러한 매개 변수를 사용하여 실제 S3 엔드포인트를 FakeS3 gem이 실행하는 가짜 엔드포인트로 대체하면 이제 Amazon 서비스에 대한 모든 요청이 로컬 가짜 서버로 위임됩니다.s3_포스_경로_스타일
- S3는 URL에 버킷의 이름을 포함하는 두 가지 스타일을 허용합니다. 버킷의 이름을 도메인 스타일(bucket.s3.amazonaws.com) 또는 경로 스타일(s3.amazonaws.com/bucket)로 배치하도록 선택할 수 있습니다. 일을 단순하게 유지하고 버킷의 하위 도메인을 루프백 주소에 매핑하는 것과 관련된 추가 구성을 피하기 위해 개발 환경에서는 도메인 스타일보다 경로 스타일을 선호합니다.use_ssl
- 는 AWS SDK가 바닐라 HTTP 대신 HTTPS를 사용하도록 강제합니다. 이 옵션을 비활성화해야 하는 이유는 FakeS3 gem이 기본적으로 AWS 클라이언트가 수행하는 HTTPS 요청을 지원하지 않기 때문입니다.프로덕션 환경에 대한 구성은 매우 간단합니다:
# config/aws.yml
프로덕션: &프로덕션
access_key_id:
secret_access_key:
스테이징: *프로덕션
하지만 이번에는 실제 S3 서비스를 다루기 때문에 실제 AWS 자격 증명을 제공해야 합니다.
잠재적인 보안 위험 때문에 액세스 키와 같은 비밀 값은 환경 변수를 사용하는 등의 방법으로 버전 관리 시스템에서 제외하는 것이 좋습니다. 여기서는 ERB를 사용하여 해당 값을 구성 파일에 삽입하겠습니다.
이제 Paperclip을 마주하고 이미 구성된 S3 클라이언트와 잘 작동하도록 강제할 차례입니다. Paperclip 구성의 주요 목표는 가짜 서버가 호스팅하는 리소스를 찾을 수 있는 스토리지 경로를 확보하는 것입니다:
localhost:10001/:버킷_이름/:경로
다시 개발 환경부터 시작하겠습니다:
# config/paperclip.yml
개발: &개발
storage: :s3
버킷: "development"
s3_host_name: "localhost"
url: ":s3_alias_url"
경로 ":클래스/:첨부/:id_partition/:스타일/:파일명.:확장자"
s3_host_alias: "localhost:10001/개발"
test: *개발
스토리지
- 는 스토리지 캐리어를 지정합니다(기본적으로 로컬 파일 시스템). AWS S3를 사용하고 있으므로 다음과 같이 변경해야 합니다. :s3
.버킷
- 파일을 저장할 S3 버킷의 이름입니다. 버킷이 존재하지 않으면 Paperclip에서 버킷을 만들려고 시도합니다.url
- 로 설정 :s3_alias_url
를 사용하면 Paperclip이 S3 버킷의 호스트 이름에 별칭을 지정합니다. :s3_host_alias
매개변수입니다.s3_host_alias
- 별칭을 기본 S3 버킷의 호스트로 지정합니다. 호스트, 포트 및 버킷의 이름 배치는 AWS 클라이언트의 구성과 일치합니다.경로
- 패턴으로 파일을 버킷에 저장할 키를 지정합니다. 키는 파일 이름처럼 버킷 내에서 고유해야 합니다. S3는 디렉터리를 지원하지 않기 때문에 파일 이름과 같은 /
기호를 사용하여 디렉토리 구조를 시뮬레이션합니다.# config/paperclip.yml
프로덕션: &프로덕션
storage: :s3
버킷:
url: ":s3_도메인_URL"
경로 ":클래스/:첨부파일/:아이디_파티션/:스타일/:파일명.:확장자"
스테이징: *프로덕션
AWS 자격 증명과 마찬가지로 버킷 이름도 코드 베이스 외부에 저장해야 하는 비밀 값으로 간주됩니다. 환경 변수에 이름을 저장하는 것이 좋습니다.
마지막으로, 초기화 프로그램에서 설정을 Paperclip의 기본 옵션으로 병합합니다:
# config/initializers/paperclip.rb
paperclip_defaults = Rails.application.config_for :paperclip
paperclip_defaults.symbolize_keys!
종이 클립::첨부 파일.기본값_옵션.병합! 종이 클립 _ 기본값
AWS와 Paperclip 구성 모두 아래에서 실행될 것으로 예상되는 로컬 S3 페이크 서버에 대한 참조가 포함되어 있습니다. localhost:10001
. 개발 작업을 하기 전에 다음 명령어(FakeS3 gem에서 제공)로 서버를 시작해야 합니다:
fakes3 -r public/system -p 10001
전달된 매개변수는 다음과 같습니다:
root -r
- 루트 디렉터리에 업로드된 파일이 저장됩니다. 업로드한 파일이 리포지토리에 저장되지 않도록 하려면 VCS에서 이 디렉터리를 제외하는 것이 좋습니다.포트 -p
- 로컬 서버가 실행될 포트 수입니다.애플리케이션에서 프로세스 관리를 위해 Foreman을 사용하는 경우 Procfile에 다음 항목을 추가하는 것이 편리할 수 있습니다:
# 프로시저
fakes3: fakes3 -r ${FAKES3_STORAGE_PATH:-public/system} -p ${FAKES3_PORT:-10001}
이렇게 하면 S3 관련 기능을 개발해야 할 때마다 페이크서버를 실행하는 데 낭비하는 시간을 절약할 수 있습니다.
모든 요청을 로컬 가짜 서버에 위임하도록 AWS 클라이언트를 구성하고, 구축된 리소스의 URL에 가짜 S3 엔드포인트를 사용하도록 Paperclip을 설정하고, 로컬 파일 시스템에 모든 파일을 저장하는 가짜 S3 gem에서 제공하는 가짜 서버를 시작했습니다.
그 결과 인터넷 연결로부터 독립하고 비용을 절감하여 더 빠르고 안정적으로 개발할 수 있게 되었습니다.