🌞

Sử dụng nhiều AWS account trong Gitlab CI

Sửa bài viết này

Sử dụng 1 tài khoản

Để bắt đầu, chúng ta sử dụng 1 tài khoản để upload lên S3, chúng ta sẽ khai báo các biến môi trường sau bên trong Gitlab CI

  • AWS_S3_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

File pipeline .gitlab-ci.yml

stages:
	- build
	- production

create file:
	stage: build
	image: alpine
	script:
		- touch foo.bar
	artifacts:
		paths:
			- foo.bar

deploy to production:
	stage: production
	image:
		name: amazon/aws-cli
		entrypoint: [""]
	script:
		- aws --version
		- aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt

Theo mặc định các biến AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION sẽ được AWS CLI sử dụng để authen, không cần khai báo gì thêm

Nhiều tài khoản bằng biến môi trường

Cách này không phải hay nhất nhưng đa phần chúng ta sẽ nghĩ ngay tới đó là đặt hàng loạt biến AWS khác nhau cho từng môi trường

Bên trong job, chúng ta sẽ lấy các biến môi trường này ra để sử dụng, khá "thủ công"

stages:
    - build
    - test
    - production

create file:
    stage: build
    image: alpine
    script:
      - touch foo.bar
    artifacts:
        paths:
        - foo.bar

deploy to test:
    stage: test
    image:
        name: amazon/aws-cli
        entrypoint: [""]
    before_script:
	    # Set lại giá trị credential
        - export AWS_ACCESS_KEY_ID=$TEST_AWS_ACCESS_KEY_ID
        - export AWS_SECRET_ACCESS_KEY=$TEST_AWS_SECRET_ACCESS_KEY
        - export AWS_DEFAULT_REGION=$TEST_AWS_DEFAULT_REGION
    script:
        - aws --version
        - aws s3 cp foo.bar s3://$TEST_AWS_S3_BUCKET/foo.txt

deploy to production:
    stage: production
    image:
        name: amazon/aws-cli
        entrypoint: [""]
    before_script:
	    # Set lại giá trị credential
        - export AWS_ACCESS_KEY_ID=$PROD_AWS_ACCESS_KEY_ID
        - export AWS_SECRET_ACCESS_KEY=$PROD_AWS_SECRET_ACCESS_KEY
        - export AWS_DEFAULT_REGION=$PROD_AWS_DEFAULT_REGION        
    script:
        - aws --version
        - aws s3 cp foo.bar s3://$PROD_AWS_S3_BUCKET/foo.txt

Cách này nhìn chung là dễ hiểu, dễ làm, tuy nhiên nó lại phải khai báo khá nhiều biến bên trong pipeline và quá nhiều config trên từng job

Nhiều tài khoản theo environment và scope biến môi trường theo environment

Nếu bạn để ý bên trong phần khai báo biến môi trường, chúng ta có cột Environment, có nghĩa là biến có thể có scope theo từng môi trường được

Chúng ta cần khai báo thêm environment cho job để nó có thể sử dụng biến môi trường thuộc scope

deploy to test:  
    stage: test  
    ...  
    environment:  
        name: testdeploy to production:  
    stage: production  
    ...  
    environment:  
        name: production

Sau khi khai báo thêm biến môi trường cho job, bên trong màn hình thêm variables lúc này chúng ta sẽ có thêm các lựa chọn ngoài All như trước

Bây giờ chúng ta chỉ cần bỏ đi prefix, đặt lại đúng tên và môi trường là xong

stages:
    - build
    - test
    - production

create file:
    stage: build
    image: alpine
    script:
      - touch foo.bar
    artifacts:
        paths:
        - foo.bar

deploy to test:
    stage: test
    image:
        name: amazon/aws-cli
        entrypoint: [""]
    script:
        - aws --version
        - aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
    environment:
        name: test        

deploy to production:
    stage: production
    image:
        name: amazon/aws-cli
        entrypoint: [""]      
    script:
        - aws --version
        - aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
    environment:
        name: production

Như có thể thấy, pipeline giờ gần giống như trường hợp chúng ta chỉ có 1 tài khoản, rất dễ hiểu dễ làm, không cần thêm config gì rườm rà trên file .gitlab-ci.yml, tuy nhiên nó vẫn có quá nhiều biến môi trường cần phải quản lý

Nhiều tài khoản bằng AWS Profile

Bên trong Gitlab, variables không chỉ có thể là giá trị, nó còn có thể là file, chúng ta khai báo các credentials theo dạng file

Một file credentials của aws sẽ có dạng ~/.aws/credentials

[production]
aws_access_key_id=AKIAXKYMDEKGYDJ2OT4U
aws_secret_access_key=N/T3ZafKprWt3EMnMFDQCXXXXXXXXXXXXX
region=us-east-1
[test]
aws_access_key_id=AKIA6C7LEVAXLETXGONN
aws_secret_access_key=wtilH45rB3oUyIjJnIALhOhLlyXXXXXXXXXXXXX
region=us-east-1

Khai báo biến AWS_SHARED_CREDENTIALS_FILE dạng file

Biến AWS_SHARED_CREDENTIALS_FILE lúc này sẽ chứa đường dẫn đến đến file

AWS CLI một cách thần kỳ sẽ hiểu dùng file này để lấy thông tin credential, job chúng ta chỉ cần chỉ định biến AWS_PROFILE muốn sử dụng

stages:
    - build
    - test
    - production

create file:
    stage: build
    image: alpine
    script:
      - touch foo.bar
    artifacts:
        paths:
        - foo.bar

deploy to test:
    stage: test
    image:
        name: amazon/aws-cli
        entrypoint: [""]
    variables:
	    ## chỉ định profile test
        AWS_PROFILE: test
    script:
        - aws --version
        - aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
    environment:
        name: test        

deploy to production:
    stage: production
    image:
        name: amazon/aws-cli
        entrypoint: [""] 
    variables:
	    # chỉ định profile production
        AWS_PROFILE: production             
    script:
        - aws --version
        - aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
    environment:
        name: production

Và nếu thích dùng môi trường thay vì biến, chúng ta khai báo thêm biến môi trường để map vào từng profile, tuy nhiên mình thấy nó thêm rườm rà, khuyên bạn không nên.

Chúc các bạn thực vui!

GitLab CI: How to Manage AWS CLI Credentials for multiple AWS Accounts in a Single Pipeline Markdown selection 7246 bytes 840 words 249 lines Ln 250, Col 239HTML 4358 characters 807 words 173 paragraphs

Initializing...