amazon-web-services - 如何在 Terraform for Amazon ECR 中创建 IAM 角色?
问题描述
在这个答案的后面,我正在尝试创建一个aws_iam_role
允许访问 ECR 的。但是,当我定义以下内容时:
resource "aws_iam_role" "jenkins_ecr_role" {
name = "JenkinsECRRole"
assume_role_policy = <<END_OF_POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecr.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
END_OF_POLICY
}
我得到错误:
Error: Error creating IAM Role JenkinsECRRole:
MalformedPolicyDocument: Invalid principal in policy: "SERVICE":"*"
ecr.amazonaws.com
根据 AWS 文档,它看起来像是一个有效的委托人。我究竟做错了什么?
解决方案
似乎这个问题还没有得到完全回答,所以我将尝试举例说明我是如何为我的 gitlab-runner ec2 实例添加 ecr 的。首先,ec2 实例需要一个iam_instance_profile
您似乎已经拥有的实例。第二:您需要assume-role
使实例能够承担服务的角色。
请注意,我可以访问所有资源,而不仅仅是特定资源(您可以根据需要进行调整)
角色
resource "aws_iam_role" "role" {
name = "${local.env}-role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["ec2.amazonaws.com"]
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}
允许访问 ECR 的策略
resource "aws_iam_policy" "policy" {
name = "${local.env}-ecr-access-policy"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = [
"ecr:*",
]
Effect = "Allow"
Resource = "*"
},
]
})
}
策略对角色的附加
resource "aws_iam_policy_attachment" "attach" {
name = "${local.env}-attach"
roles = ["${aws_iam_role.role.name}"]
policy_arn = "${aws_iam_policy.policy.arn}"
}
最后是 EC2 需要的配置文件
resource "aws_iam_instance_profile" "profile" {
name = "${local.env}-gitlab-runner-instance-profile"
role = aws_iam_role.role.name
}
EC2 实例
resource "aws_instance" "ec2" {
ami = "ami-06c94f9acb4ba21b2"
instance_type = "t2.small"
associate_public_ip_address = true
key_name = "<key_name>"
subnet_id = <subnet>
iam_instance_profile = aws_iam_instance_profile.profile.name
vpc_security_group_ids = ["<security_group>"]
tags = {
Environment = "dev"
}
}
推荐阅读
- matlab - 为什么我得到 fminsearch 未定义函数错误
- ios - 显示相机视图的 ImageView 'On-Top'
- sql - 提高查询的性能
- python - Numpy Stack 的不同行为
- javascript - 如何将材质图标添加到 Angular 数据表标题
- java - Java AnnotationProcessor 无法使用 gradle 5.1.1 生成代码
- c# - WPF 在一个 ListBox 中选择项目并在第二个 ListBox 中显示相应的列表
- kubernetes - 防止 kube-system pod 在特定节点上运行
- python - 如何在不通过 MQTT 订阅的情况下保存数据值?
- swift - Swift 中有内置的堆栈实现吗?