Pass AWS credentials (IAM role credentials) to code running in docker container

后端 未结 2 1193
粉色の甜心
粉色の甜心 2020-12-29 06:25

When running code on an EC2 instance, the SDK you use to access AWS resources, automagically talks to a locally linked web server on 169.254.169.254 and gets that instances

相关标签:
2条回答
  • 2020-12-29 06:38

    The EC2 metadata service will usually be available from within docker (unless you use a more custom networking setup - see this answer on a similar question).

    If your docker network setup prevents it from being accessed, you might use the ENV directive in your Dockerfile or pass them directly during run, but keep in mind that credentials from IAM roles are automatically rotated by AWS.

    0 讨论(0)
  • 2020-12-29 06:50

    Amazon does have some mechanisms for allowing containers to access IAM roles via the SDK and either routing/forwarding requests through the ECS agent container or the host. There is way too much to copy and paste, but using --net host is the LEAST recommended option because without additionally filters that allows your container full access to anything it's host has permission to do.

    https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html

    declare -a ENVVARS
    declare AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
    get_aws_creds_local () {
       # Use this to get secrets on a non AWS host assuming you've set credentials via some mechanism in the past, and then don't pass in a profile to gitlab-runner because it doesn't see the ~/.aws/credentials file where it would look up profiles
       awsProfile=${AWS_PROFILE:-default}
       AWS_ACCESS_KEY_ID=$(aws --profile $awsProfile configure get aws_access_key_id)
       AWS_SECRET_ACCESS_KEY=$(aws --profile $awsProfile configure get aws_secret_access_key)
       AWS_SESSION_TOKEN=$(aws --profile $awsProfile configure get aws_session_token)
       
    }
    
    get_aws_creds_iam () {
      TEMP_ROLE=$(aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session)
      AWS_ACCESS_KEY_ID=$(echo $TEMP_ROLE | jq -r . Credentials.RoleAccessKeyID)
      AWS_SECRET_ACCESS_KEY=$(echo $TEMP_ROLE | jq -r . Credentials.RoleSecretKey)
      AWS_SESSION_TOKEN=$(echo $TEMP_ROLE | jq -r . Credentials.RoleSessionToken)
    }
    
    get_aws_creds_local
    
    get_aws_creds_iam
    
    ENVVARS=("AWS_ACCESS_KEY_ID=$ACCESS_KEY_ID" "AWS_SECRET_ACCESS_KEY=$ACCESS_SECRET_ACCESS_KEY" "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN")
    
    # passing creds into GitLab runner
     gitlab-runner exec docker stepName $(printf " --env %s" "${ENVVARS[@]}")
    
    # using creds with a docker container
    docker run -it --rm $(printf " --env %s" "${ENVVARS[@]}") amazon/aws-cli get-caller-identity
    
    0 讨论(0)
提交回复
热议问题