问题:我正在尝试使用 Pulumi 公开公开 AWS Elasticache Redis 实例。 Redis 设置使用 @pulumi/aws 包,我正在配置有公共子网、互联网网关和用于出站访问的路由表的 VPC 中工作。
我已将安全组附加到 Redis 实例,允许从任何 IP 访问端口 6379。尽管如此,Redis 实例仍然无法从互联网访问。这是相关的 Pulumi 代码:
import * as aws from '@pulumi/aws';
import * as pulumi from '@pulumi/pulumi';
const stackName = pulumi.getStack();
const vpc = new aws.ec2.Vpc(`vpc-${stackName}`, {
cidrBlock: '10.0.0.0/16',
enableDnsHostnames: true,
enableDnsSupport: true,
});
const subnet1 = new aws.ec2.Subnet(`subnet1-${stackName}`, {
vpcId: vpc.id,
availabilityZone: 'us-east-1a',
cidrBlock: '10.0.26.0/24',
mapPublicIpOnLaunch: true,
});
const igw = new aws.ec2.InternetGateway(`igw-${stackName}`, { vpcId: vpc.id });
const routeTable = new aws.ec2.RouteTable(`routeTable-${stackName}`, {
vpcId: vpc.id,
routes: [{ cidrBlock: '0.0.0.0/0', gatewayId: igw.id }],
});
new aws.ec2.RouteTableAssociation(`rta-${stackName}`, {
subnetId: subnet1.id,
routeTableId: routeTable.id,
});
export const redisSecurityGroup = new aws.ec2.SecurityGroup(`redis-sg-${stackName}`, {
vpcId: vpc.id,
ingress: [{ fromPort: 6379, toPort: 6379, protocol: 'tcp', cidrBlocks: ['0.0.0.0/0'] }],
egress: [{ fromPort: 0, toPort: 0, protocol: '-1', cidrBlocks: ['0.0.0.0/0'] }],
});
export const redisCache = new aws.elasticache.ServerlessCache(`redisCache-${stackName}`, {
engine: 'redis',
name: `redis-${stackName}`,
securityGroupIds: [redisSecurityGroup.id],
subnetIds: [subnet1.id],
userGroupId: '<YOUR_USER_GROUP_ID>',
});
我尝试了以下方法但没有成功:
已验证子网上的 mapPublicIpOnLaunch 设置为 true。 配置安全组以允许端口 6379 上的所有入口/出口。 确保互联网网关存在用于传出连接的公共路由。 我是否缺少特定的配置步骤来使 Redis 可通过互联网访问?
环境:
Pulumi 版本:
"@pulumi/aws": "^6.56.1",
"@pulumi/awsx": "^2.16.1",
"@pulumi/esc-sdk": "^0.10.2",
"@pulumi/pulumi": "^3.137.0",
AWS Elasticache 版本:Redis 7.1 Node.js:22
AWS ElastiCache 实例从未分配公共 IP。 Amazon 做出的设计决定是 ElastiCache 实例永远无法通过 Internet 直接访问。
根据 ElastiCache 文档,Amazon 建议创建一个 NAT 实例以将流量路由到 ElastiCache。