Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
ubuntu EC2에 apache2와 php를 설치 후, AWS PHP SDK를 세팅해 보자.
sudo su
apt-get update
apt-get install apache2 -y
apt-get install php -y
apt-get install p7zip -y
(현재 최신버전인 php 8.1이 설치됨)
작업 폴더를 이동시키고 진행해 주자.
cd /var/www/html
PHP 의존성 관리 도구인 Composer 설치설치하자.
https://getcomposer.org/download/
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv /var/www/html/composer.phar /usr/bin/composer
composer require aws/aws-sdk-php
이렇게 해주어야 /var/www/html 경로에 aws-sdk-php가 설치되어 php 파일들이 이를 참조해 사용할 수 있다.
접속 테스트
ec2의 public ip로 접근해 보자.
touch /var/www/html/test.php
nano /var/www/html/test.php
<?php phpinfo(); ?>
service apache2 restart
php도 정상동작 하고 있다.
DyanmoDB에서 데이터 읽어오기
보안그룹에서 추가적으로 https inbound를 추가해 주자.
이제 이 EC2가 DynamoDB에 접근할 수 있도록 IAM Role을 만들어 주자.
만들어준 역할을 Ec2에 연결한다.
DynamoDB 테이블 세팅
간단히 데이터를 넣어주었다.
테이블 검색 php 코드
<?php
require 'vendor/autoload.php'; # 설치한 sdk의 사용
use Aws\DynamoDb\DynamoDbClient;
$dynamodb = new DynamoDbClient([
'region' => 'ap-northeast-1',
'version' => 'latest',
#'profile' => 'default' # profile 세팅이 있으면 aws/credential 확인
]);
$Table_name = 'user_table';
$result = $dynamodb->getItem([
'TableName' => $Table_name,
'Key' => [
'id' => ['S' => "찾을id"],
],
]);
?>
해당 코드를 db.php에 세팅하여 실행해 보았다.
ec2에 연결된 권한이 있더라도 credentials을 요구하는 오류가 발생하고 있다.
에러가 난 코드를 확인해 보니 credentials의 확인하는 순서가 적혀있었다.
* Create a default credential provider that first checks for environment
* variables, then checks for the "default" profile in ~/.aws/credentials,
* then checks for "profile default" profile in ~/.aws/config (which is
* the default profile of AWS CLI), then tries to make a GET Request to
* fetch credentials if Ecs environment variable is presented, and finally
* checks for EC2 instance profile credentials.
즉, EC2의 instance profile의 credentials가장 마지막에 확인된다.
하지만 어째서인지 instance profile이 제대로 인식이 되지 않는 듯하다.
간단히 해결하고 싶다면 iam user의 key값을 aws/credential에 등록해 주면 되지만, 키가 생성되는 순간 유출될 위험을 동반하기 때문에 EC2의 instance profile로 해결해야 안전하다.
instance profile을 직접 로드해 오는 방식으로 변경해 주었다.
use Aws\Credentials\CredentialProvider;
use Aws\DynamoDb\DynamoDbClien
$provider = CredentialProvider::instanceProfile(); //instanceProfile 직접 로드
$memoizedProvider = CredentialProvider::memoize($provider);
$dynamodb = new DynamoDbClient([
'region' => 'ap-northeast-1',
'version' => 'latest',
'credentials' => $memoizedProvider
]);
이번에는 오류가 $instance 정보를 불러올 수 없다는 것으로 변경되었다.
여러 세팅을 확인해 본 결과 ec2의 메타데이터를 확인할 수 있는 169.254.169.254로의 질의에 권한이 없었다.
이 문제는 테스트 인스턴스를 생성할 때 메타데이터 버전을 세팅하지 않았기 때문이다.
따라서 직접 curl로 질의해보아도 권한이 거부된다.
IMDS v2를 필수로 선택되어 있다면, get요청 전에 Token을 발급받는 보안 방식을 추가적으로 진행해야 한다. Php SDK가 그 부분까지는 진행해 주지 않기 때문에 권한 문제로 계속 실행이 안되었던 것이다.
이 메타데이터 옵션을 바꾸어주자.
이제 curl로 정상 질의가 된다.
이제 웹 접근이 정상적으로 dynamoDB의 데이터를 가져온다.
참조
https://nowonbun.tistory.com/608
https://bosungtea9416.tistory.com/entry/AWS-EC2-Metadata-%EA%B4%80%EB%A0%A8%ED%95%98%EC%97%AC
https://stackoverflow.com/questions/25806267/need-a-complete-example-for-dynamodb-with-php
'Cloud > AWS' 카테고리의 다른 글
AWS ECS Task와 Service 그리고 Auto scaling (Terraform) (0) | 2024.07.02 |
---|---|
VPC Endpoint로 ECR 연결하기 (Docker hub와 S3의 관계) (0) | 2024.07.01 |
CodeDeploy ECS 블루/그린 배포 방식 살펴보기 (0) | 2024.05.20 |
AWS Elastic cache Memcached의 노드간 복제 여부 확인 (0) | 2024.05.07 |
[AWS] Private subnet 자원 접근 시, ELB과 NAT GateWay의 Flow 확인하기 (0) | 2024.04.19 |