Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lambda 함수 실행기 2 #7

Open
magicpieh28 opened this issue Apr 10, 2020 · 0 comments
Open

Lambda 함수 실행기 2 #7

magicpieh28 opened this issue Apr 10, 2020 · 0 comments

Comments

@magicpieh28
Copy link
Owner

오늘 과제는 아래와 같다.

1. 임의의 S3 버킷을 생성한다.
2. 아무도 접근하지 못하도록 설정한다.
3. 특정 Lambda 함수로만 임의의 S3 버킷에 있는 파일을 읽을 수 있도록 IAM을 설정한다.

임의의 S3 버킷 생성하기


참고로 S3란 데이터들이 들어있는 저장소라 보면 된다.

  • AWS 콘솔에 로그인
  • 서비스에서 S3 선택
  • 버킷 만들기
    • 버킷 이름은 고유해야 하며 _은 사용 불가
    • 적당히 hello-lambda-test-bucket이라 해준다
    • 허용된 것보다 많은 버킷을 생성하려고 시도했습니다.라는 에러가 뜨면서 버킷 생성을 못했다

'허용된 것보다 많은 버킷을 생성하려고 시도했습니다' TooManyBuckets error일 때 버킷 할당량 변경하기

  • 콘솔에 로그인 한 상태에서 Service Quotas로 이동

  • AWS 서비스

  • S3 검색

  • Buckets 선택

  • 할당량 증가 요청 눌러서 200이든 500이든 적어서 늘리기

  • 최근 할당량 변경 요청의 상태가 할당량이 요청됨이 되면 버킷 작성이 가능해진다

  • 퍼블릭 액세스 제한을 해 주고 생성

  • 시작하기를 누르고 sample_text.txt를 업로드

    • 스토리지 클래스: 스탠다드

IAM 역할을 이용해 Lambda함수가 S3 버킷에 접근할 수 있게 하기


오만가지 도큐멘트를 읽었는데 IAM정책과 역할을 설정하는데에는 이만한 글이 없었다.
(사실 오만가지 읽은 이유는 IAM 정책과 역할에서 Lambda함수를 특정해야하는가 고민했기 때문이었다)
Amazon S3 버킷에 대한 액세스 권한을 Lambda 실행 역할에 허용하려면 어떻게 해야 합니까?

정책을 기술할 때

{
    "Version": "2012-10-17",
    "Statement": [
{
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::ExampleBucketName",
                "arn:aws:s3:::ExampleBucketName/*"
            ]
        }
    ]
}

라는 예시를 활용해서 아래에 있는 "Resource"를 내가 접근하고 싶은 버킷명으로 바꿔주었다.
해석을 해 보자면 모든 다른 리소스에 대해서는 ListAllMyBucketsGetBucketLocation만 허용하지만 아래 특정한 리소스에 관해서는 S3에서 할 수 있는 모든 액션을 허용한다는 거다.

IAM 역할과 신뢰관계도 위 링크를 따라 설정해주면 된다.

! IAM 정책과 역할을 기술하는 JSON에서는 Principal 혹은 NonPrincipal을 사용할 수 없다 !

중요한 건 Bucket 정책


요약하자면 IAM 정책에서는 어떠한 Bucket에 접근하여 어떤 작업(Action)까지 허용하는가에 대한 기준을 적으면 되고,
IAM 역할에서는 그것을 실행하는 주체를 정하기 때문에 Lambda를 선택해야 한다.
특정 Bucket에 특정 역할만 접근할 수 있다는 제한은 Bucket 정책에서 두는 것이다.

특정 Lambda 함수로 접근해야 한다는 문제라 Lambda 함수의 ARN을 적어서 제한해야 하는가, 그걸로 식별해야 하는가 했는데 의외로 어디에서도 필요로 하지 않았다..

이제 생성한 Bucket에 가서 권한->Bucket 정책을 눌러주면 JSON 에디터가 나온다.
여기서 실수했다간 Bucket을 만든 당사자도 접근불가를 하게 되니 각!별!히! 주의해야 한다.

Bucket에 대한 접근 권한을 제한하는 데에는 2 가지 방법이 있다.

1. Deny + NotPrincipal
2. Deny + Principal + Condition

처음엔 1번 방법을 이용해 접근을 금지하려고 했으나 role ARNassumed-role ARN이 둘 다 필요하기 때문에 관뒀다.

When using the NotPrincipal element, you must include both ARNs for this approach to work, and the second of these ARNs should include a variable name.

(대체 어디가야 assumed-role ARNsession name을 찾을 수 있는지 아직 찾지 못했기 때문이다)
게다가 내가 적당히 번역한(Markdown 완전 아작나서 귀찮..아서 수정 안할거라 보기 싫을 수 있다. 읽어 볼 사람들은 대충 내용만 파악하고 자세한 것은 원문 글을 읽으면 된다) AWS 특정 IAM 역할로 S3 버킷에 대한 접근을 제한하기 (적당히 해석)에도 나와있는데 NotPrincipal을 사용하면 자주 갱신(?)해줘야 한단다. 그래서 이 사람도 되도록이면 Condition으로 제한하라고 제안하고 있다. AWS 공식 도큐멘트에도 되도록이면 NotPrincipal을 사용하지 않는 것을 추장한다고 적혀있다.

In general, they attempt to do this the same way that they would with an IAM user: use a bucket policy to explicitly Deny all Principals (users and roles) to which they do not want to grant access. The drawback with this approach is the required maintenance of the bucket policy. If a new IAM user were added to the account with “s3:*” for the Action, the user would be granted access to the bucket.

두 번째는 Deny로 명시적인 접근 거부를 기본으로 하면서 Principal로 와일드카드(*)와 함께 조건문을 적는 것이다.
이 방법은 roleid만을 필요로 하기 때문에 꽤나 편리하다.

roleid 얻기


이건 콘솔이 아니라 AWS-CLI를 사용해야 한다.
커맨드로 처음 aws를 사용할 때에는 configure를 해 주어야 한다.

  • access key
  • secret access key
  • region
  • output style: json

다 끝나면

$ vim ~/.aws/configure

에서 역할 전환할 계정 정보를 적어야 한다.

나 같은 경우에는 개발자 계정(admin)으로 전환해야 해서 그 정보를 적었다.
그러면

$ aws iam get-role --profile [switched_account_name] --role-name [role_name]

으로 역할의 모든 정보를 출력할 수 있다.

거기에서 roleid를 가져와

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::[bucket_name]",
                "arn:aws:s3:::[bucket_name]/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userid": "[roleid]:*"
                }
            }
        }
    ]
}

위 JSON에 대입한다.

! roleid뒤에 :*를 적지 않으면 세션까지 제한되기 때문에 본인이 특정한 역할을 특정 Lambda 함수에 적용하더라도 access denied당하니 주의해야 한다 !

역할을 원하는 Lambda함수에 적용하면 끝


이걸 알아내겠다고 이틀을 고생했는데 막상 하고 나니 정책 JSON이 너무나도 간단해서 맥이 풀렸다.
하지만 오만가지 도큐멘트를 읽으면서 온갖 정보를 머리에 인풋했기 때문에 성장은 했을 것이다.

참고로, Deny와의 조합이 아니라 Allow와의 조합이 되면 (내가 아직 능력 부족인 것이겠지만) 아예 접근이 안되거나 잘되거나 했다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant