当前位置: 首页 > 知识库问答 >
问题:

AWS凭据如何在GitHub Actions中工作?

卜瀚漠
2023-03-14

在我的单元测试中,我使用<code>aws sdk

一开始,我试图将值设置为<code>~/。aws/credentials使用github工作流中的run命令:

# .github/workflows/nodejs.yml
steps:
  ...
  - name: Unit Test
    run: |
      mkdir -p ~/.aws
      touch ~/.aws/credentials

      echo "[default]
      aws_access_key_id = ${{ secrets.AWS_ACCESS_KEY_ID }}
      aws_secret_access_key = ${{ secrets.AWS_SECRET_KEY_ID }}
      region = ${AWS_DEFAULT_REGION}

      [github]
      role_arn = arn:aws:iam::{accountID}:role/{role}
      source_profile = default" > ~/.aws/credentials 

      npm test
    env:
      AWS_DEFAULT_REGION: us-east-1
      CI: true

原来我的测试文件:

// ses.test.js
const AWS = require("aws-sdk")
const credentials = new AWS.SharedIniFileCredentials({ profile: "github" })
AWS.config.update({ credentials })
...

我试图用另一种方式在我的测试中获得证书,但也不起作用:

js prettyprint-override">const AWS = require("aws-sdk")
const credentials = new AWS.ChainableTemporaryCredentials({
  params: {RoleArn: "arn:aws:iam::{accountID}:role/{role}"},
  masterCredentials: new AWS.EnvironmentCredentials("AWS")
)}

AWS.config.update({ credentials })

最后,我尝试创建一个自定义的Action(使用动作js库,如:@action/core、@action/io、@action/exec),以获取AWS env值并将其设置为~/. aws/凭据,但也无法按预期工作

一种有效的方法是公开AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY(不使用GitHub Actions机密,出于安全目的不理想)

有人知道AWS凭证如何在GitHub操作中使用秘密吗?

非常感谢您的关注。

共有3个答案

艾修然
2023-03-14

看看:https://github.com/aws-actions/configure-aws-credentials

它允许您配置AWS凭证和区域环境变量,以便在其他GitHub操作中使用。AWS SDK和AWS CLI将检测环境变量,以确定用于AWS API调用的凭据和区域。

申浩广
2023-03-14

避免使用长期和硬编码凭证。

配置 AWS 凭证操作提供了一种机制,用于配置 AWS 凭证和区域环境变量,以便在其他 GitHub 操作中使用。环境变量将由 AWS 开发工具包和 AWS CLI 检测,以确定用于 AWS API 调用的凭证和区域。

我建议将configure-aws-凭据配置为使用OpenID Connect(OIDC)。这允许您的GitHub Actions工作流访问AWS中的资源,而无需将AWS凭据存储为长期存在的GitHub机密。AWS帖子中的GitHub配置OpenID Connect将介绍此设置。

为了给你一个实际的例子,我建立了一个管道上传虚拟数据到S3桶。首先设置一个OpenID Connect提供者,并为github设置一个角色,以便将其加入到您的AWS帐户中。configure-aws-credentials中的例子是用CloudFormation编写的,但是我已经把它们翻译成了下面的Python Cloud-Development-Kit(CDK)。请确保更改角色条件以匹配您的存储库。

        github_oidc_provider = iam.OpenIdConnectProvider(
            self,
            "GithubOIDC",
            url="https://token.actions.githubusercontent.com",  
            thumbprints=["a031c46782e6e6c662c2c87c76da9aa62ccabd8e"],
            client_ids=[
                "sts.amazonaws.com" 
            ]
        )

        github_actions_role = iam.Role(
            self,
            "DeployToBucketRole",
            max_session_duration=cdk.Duration.seconds(3600),
            role_name="github-actions-role",
            description="Github actions deployment role to S3",
            assumed_by=iam.FederatedPrincipal(
                federated=github_oidc_provider.open_id_connect_provider_arn,
                conditions={
                    "StringLike": {
                        # <GITHUB USERNAME>/<YOUR REPO NAME>
                        "token.actions.githubusercontent.com:sub": 'repo:arbitraryrw/cdk-github-actions-demo:*' 
                    }
                },
                assume_role_action="sts:AssumeRoleWithWebIdentity"
            )
        )

        bucket = s3.Bucket(
            self,
            f"example_bucket",
            bucket_name="cdk-github-actions-demo",
            encryption=s3.BucketEncryption.S3_MANAGED,
            enforce_ssl=True,
            block_public_access=s3.BlockPublicAccess.BLOCK_ALL,
            removal_policy=cdk.RemovalPolicy.DESTROY,
            auto_delete_objects=True
        )

        # Give the role permissions to read / write to the bucket
        bucket.grant_read_write(github_actions_role)

然后,您可以在管道中引用它,并使用这些凭据运行AWS CLI / SDK命令。注意,代码片段引用了Github加密的秘密,我建议利用这个功能:

name: Example CDK Pipeline

on:
  push:
    branches: [ main ]

jobs:
  build:
    name: Emulate build step
    runs-on: ubuntu-latest

    steps:
    - name: Checking out repository
      uses: actions/checkout@v2
    - name: "Upload artifacts"
      uses: actions/upload-artifact@v2
      with:
        name: build-artifacts
        path: ${{ github.workspace }}/resources

  deploy:
    needs: build
    name: Deploy build artifacts to S3
    runs-on: ubuntu-latest
    # These permissions are needed to interact with GitHub's OIDC Token endpoint.
    permissions:
      id-token: write
      contents: read

    steps:
    - name: "Download build artifacts"
      uses: actions/download-artifact@v2
      with:
        name: build-artifacts
        path: ${{ github.workspace }}/resources

    - name: Configure AWS credentials from Test account
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-region: us-east-1
        role-to-assume: ${{ secrets.AWS_ROLE_FOR_GITHUB }}
        role-session-name: GitHubActions
    - run: aws sts get-caller-identity
    - name: Copy files to the test website with the AWS CLI
      run: |
        aws s3 sync ./resources s3://${{ secrets.BUCKET_NAME }}

关于如何使用CDK设置它的完整例子,你可以看看我设置的cdk-github-actions-demo repo。

齐承泽
2023-03-14

幸运的是,< code>aws-sdk应该自动检测设置为环境变量的凭证,并将它们用于请求

要访问操作中的秘密,您需要在repo中设置它们。然后,您可以将它们作为env var公开给步骤。

更多详情请见GitHub加密秘密

    < li >在GitHub上,导航到存储库的主页 < li >在您的存储库名称下,单击⚙设置标签 < li >储存库设置按钮 < li >在左侧边栏中,单击“机密” < li >在“名称”输入框中输入您的密码名称 < li >键入您的密码值 < li >单击添加密码

在你的情况下,你将需要为AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY添加机密。

现在,这些值已设置好,您可以通过工作流 yaml 将这些值传递到操作中:

steps:
...
- name: Unit Test
  uses: ...
  env:
    AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
    AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  run: ...
 类似资料:
  • 我必须在nifi进程中使用aws临时凭证AccessKey、SecretKey和令牌来访问S3对象。AccessKey、SecretKey和Token将由Api调用提供。如何在nifi ListS3对象等中使用这些临时凭证? 我发现的选项之一是使用AWSCre的alsProviderControlllerService,因为这可以根据API调用更新控制器服务的值吗? 在这个场景中我还可以使用其他选

  • 我遇到了与这里提到的问题类似的问题。我使用的是spring xml配置。我指定了我的全局AWS上下文凭据。我正在使用S3出站通道适配器从S3下载一个文件。我在config.properties文件中指定了我的键。我仍然看不出用来和S3谈话的凭据。 s3-read.xml aws-credentials.xml 配置属性 例外情况是: 我在这方面花了很多时间。当我尝试调试时,它似乎在寻找默认的凭据提

  • 当使用AWS CLI时,是否有一种方法可以指定它使用凭据文件,而不是存储在env变量中的值? 是存储在~/.aws/credentials中的凭据文件中的配置文件名。我希望AWS CLI默认使用此凭据文件,而不使用存储在env变量中的凭据文件。我怎么能这么做?

  • 我的意思是我的错误是: ``` 正在检查“contacts”表是否存在{unrecognizedClientException:请求中包含的安全令牌无效。在request.extractorry(/root/work/contacts_api/node_modules/aws-sdk/lib/protocol/json.js:51:27)在request.calllisteners(/root/w

  • 问题内容: 我在AppEngine Python3.7标准版中启动了新应用。 我正在尝试使用以下代码段获取凭据,但失败了。 任何人都可以使用GAE标准Python37吗? 输入: 输出: 问题答案: 将App Engine Standard与python 3.7结合使用时,没有google.xxx库可用。您必须构建自己的数据库或使用标准的Python库。这同样适用于:,,,,,,,,,等等,甚至在

  • 我已经在的Jenkins中输入了AWS凭据,但是它们不会显示在AWS Elastic Beanstek插件中的Post Build步骤的下拉列表中。 如果我单击验证凭据,我会得到这个奇怪的错误。 失败com.amazonaws.SdkClientException:无法从链中的任何提供者加载AWS凭据:[环境变量凭据提供者:无法从环境变量(AWS_ACCESS_KEY_ID(或AWS_ACCESS